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=''): for i in xrange(count): c = mdb(a=i-1, b=i) @timeit def test_sqlite_insert(cur, des=''): for i in xrange(count): cur.execute('insert into test values(?, ?, ?)', (i-1, i, i+1)) @timeit def test_sqlite_query(cur, des=''): for i in xrange(count): cur.execute('select * from test where a=? and b=?', (i-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
SQLite
2 pydblite和sqlite的性能毫无疑问,pydblite的使用方式非常地Pythonic,但是它的效率如何呢?由于我们主要关心的是数据插入和查询速度,所以不妨仅对这两项做一个对比。写一个简单的测试脚本:
|