有没有办法从python异步或并行运行SQLite查询?

时间:2014-09-19 18:17:35

标签: python sqlite asynchronous multicore

如何以某种“非顺序”的方式从python运行sqlite3语句?

这是一些代码,基本上直接来自python docs,在sqlite3上。 (我假设这段代码是按顺序执行的):

import sqlite3
conn = sqlite3.connect('::memory')
c = conn.cursor()

###First sequence
c.execute('''DROP TABLE IF EXISTS stocks''')
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','SOME_STOCK',100,35.14)")
conn.commit()

result_stocks = c.execute('''SELECT * FROM stocks''').fetchall()

### Second Sequence
c.execute('''DROP TABLE IF EXISTS bonds''')
# Create first table table
c.execute('''CREATE TABLE bonds
             (date text, trans text, symbol text, qty real, price real)''')
c.execute("INSERT INTO bonds VALUES ('2006-01-05','BUY','SOME_BOND',100,35.14)")
conn.commit()

result_bonds = c.execute('''SELECT * FROM bonds''').fetchall()

conn.close()

print(result_stocks)
print(result_bonds)

有没有办法在不等待“第一序列”完成的情况下执行“第二序列”?

3 个答案:

答案 0 :(得分:1)

SQLite数据库一次只能由一个连接写入;写事务将锁定整个数据库并阻止其他线程和进程读取或写入。

所以,是的,您可以为每个序列创建一个线程,但由于任何时候只有一个序列可以写入数据库,因此它们不会同时执行,从而无法异步运行它们。

如果你在线程运行查询时除了查询数据库之外还做其他事情,那么你会看到一个好处,因为查询线程将等待磁盘,释放CPU来做其他事情。但在您的示例中,在单独的线程中运行这两个序列没有任何好处。

答案 1 :(得分:0)

但是,您需要在单独的线程中运行它们,因为本机sqlite3模块不支持异步查询。

答案 2 :(得分:0)

如果切换到isolation_level=None,您将能够以比默认模式更少的摩擦力从数据库中读取数据。

我建议您阅读本文,了解有关如何提高性能的更多提示: http://charlesleifer.com/blog/going-fast-with-sqlite-and-python/?utm_content=bufferee5e3&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer