Python内存数据库/引擎
admin
2023-07-31 00:46:51
0

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

1234567891011 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

12345678910111213 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,但是它的效率如何呢?由于我们主要关心的是数据插入和查询速度,所以不妨仅对这两项做一个对比。写一个简单的测试脚本:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 import timecount = 100000 def timeit(func):    def wrapper(*args, **kws):        t = time.time()        func(*args)        print time.time() t, kws[\’des\’]    return wrapper @timeitdef test_insert(mdb, des=\’\’):    for i in xrange(count):        mdb.insert(a=i1, b=i, c=i+1) @timeitdef test_query_object(mdb, des=\’\’):    for i in xrange(count):        c = mdb(a=i1, b=i) @timeitdef test_sqlite_insert(cur, des=\’\’):    for i in xrange(count):        cur.execute(\’insert into test values(?, ?, ?)\’, (i1, i, i+1)) @timeitdef test_sqlite_query(cur, des=\’\’):    for i in xrange(count):        cur.execute(\’select * from test where a=? and b=?\’, (i1用比较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

1234567891011 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

12345678910111213 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,但是它的效率如何呢?由于我们主要关心的是数据插入和查询速度,所以不妨仅对这两项做一个对比。写一个简单的测试脚本:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 import timecount = 100000 def timeit(func):    def wrapper(*args, **kws):        t = time.time()        func(*args)        print time.time() t, kws[\’des\’]    return wrapper @timeitdef test_insert(mdb, des=\’\’):    for i in xrange(count):        mdb.insert(a=i1, b=i, c=i+1) @timeitdef test_query_object(mdb, des=\’\’):    for i in xrange(count):        c = mdb(a=i1, b=i) @timeitdef test_sqlite_insert(cur, des=\’\’):    for i in xrange(count):        cur.execute(\’insert into test values(?, ?, ?)\’, (i1, i, i+1)) @timeitdef test_sqlite_query(cur, des=\’\’):    for i in xrange(count):        cur.execute(\’select * from test where a=? and b=?\’, (i1/div>678

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...