【发布时间】:2018-01-27 10:35:02
【问题描述】:
我想构建一个辅助函数来从 sqlite 获取查询结果,用于与另一个数据库的结果进行比较。
我希望用户有一个简单的界面,他可以通过查询调用函数并获得结果,而无需任何其他准备。
我最终写了 2 个函数:
import sqlite3
.
.
def sqlite_query_executor(query):
conn=sqlite3.connect(':memory:')
cur=conn.cursor()
yield cur.execute(query).fetchall()[0][0]
还有一个要被用户调用的:
def query_sqlite(query):
return next(sqlite_query_executor(query))
在修改第一个函数时,我最初写了另一个版本,结尾略有不同:
def sqlite_query_executor(query):
conn=sqlite3.connect()
cur=conn.cursor()
while True:
yield cur.execute(query).fetchall()[0][0]
两个版本似乎都运行良好,但我在机制上遇到了困难。
也许有人能阐明其中的区别吗?这种用例的正确模式是什么?
【问题讨论】:
-
第一个函数在每次迭代时连接。这似乎表现不佳。
-
所以光标一直保持连接?不需要关闭连接吗?
-
当你真的不想要all时,你为什么还要为这些
yield和next和fetchall烦恼? -
@CoryMadden 这是一个测试套件,我假设如果它被调用,它会被称为一堆。
-
@user2357112 这是一个产生一个结果的单个查询,我猜常规提取也可以工作
标签: python sqlite generator yield coroutine