1 初探
在平时的开发工作中,我们可能会有这样的需求:我们希望有一个内存数据库或者数据引擎,用比较Pythonic的方式进行数据库的操作(比如说插入和查询)。
举个具体的例子,分别向数据库db中插入两条数据,”a=1, b=1″ 和 “a=1, b=2”, 然后想查询a=1的数据可能会使用这样的语句db.query(a=1),结果就是返回前面插入的两条数据; 如果想查询a=1, b=2的数据,就使用这样的语句db.query(a=1, b=2),结果就返回前面的第二条数据。
那么是否拥有实现上述需求的现成的第三方库呢?几经查找,发现PyDbLite能够满足这样的需求。其实,PyDbLite和Python自带的SQLite均支持内存数据库模式,只是前者是Pythonic的用法,而后者则是典型的SQL用法。
他们具体的用法是这样的:
PyDbLite
1
2
3
4
5
6
7
8
9
10
11
|
import
pydblite
# 使用内存数据库
pydb
=
pydblite
.
Base
(
':memory:'
)
# 创建a,b,c三个字段
pydb
.
create
(
'a'
,
'b'
,
'c'
)
# 为字段a,b创建索引
pydb
.
create_index
(
'a'
,
'b'
)
# 插入一条数据
pydb
.
insert
(
a
=
-
1
,
b
=
0
,
c
=
1
)
# 查询符合特定要求的数据
results
=
pydb
(
a
=
-
1
,
b
=
0
)
|
SQLite
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
sqlite3
# 使用内存数据库
con
=
sqlite3
.
connect
(
':memory:'
)
# 创建a,b,c三个字段
cur
=
con
.
cursor
(
)
cur
.
execute
(
'create table test (a char(256), b char(256), c char(256));'
)
# 为字段a,b创建索引
cur
.
execute
(
'create index a_index on test(a)'
)
cur
.
execute
(
'create index b_index on test(b)'
)
# 插入一条数据
cur
.
execute
(
'insert into test values(?, ?, ?)'
,
(
-
1
,
0
,
1
)
)
# 查询符合特定要求的数据
cur
.
execute
(
'select * from test where a=? and b=?'
,
(
-
1
,
0
)
)
|
2 pydblite和sqlite的性能
毫无疑问,pydblite的使用方式非常地Pythonic,但是它的效率如何呢?由于我们主要关心的是数据插入和查询速度,所以不妨仅对这两项做一个对比。写一个简单的测试脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import
time
count
=
100000
def
timeit
(
func
)
:
def
wrapper
(
*
args
,
*
*
kws
)
:
t
=
time
.
time
(
)
func
(
*
args
)
print
time
.
time
(
)
-
t
,
kws
[
'des'
]
return
wrapper
@
timeit
def
test_insert
(
mdb
,
des
=
''
)
:
for
i
in
xrange
(
count
)
:
mdb
.
insert
(
a
=
i
-
1
,
b
=
i
,
c
=
i
+
1
)
@
timeit
def
test_query_object
(
mdb
,
des
=
''
|