Python内存数据库、引擎课案.doc
文本预览下载声明
Python内存数据库/引擎
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
复制代码
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
复制代码
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,但是它的效率如何呢?由于我们主要关心的是数据插入和查询速度,所以不妨仅对这两项做一个对比。写一个简单的测试脚本:
复制代码
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, i))
print -------pydblite--------
import pydblite
pydb = pydblite.Base(:memory:)
pydb.create(a, b, c)
pydb.create_index(a, b)
test_insert(pydb, des=insert)
test_query_object(pydb, des=query, object cal
显示全部