重复使用sqlite3游标有什么副作用?

时间:2019-01-28 05:00:38

标签: python orm sqlite

作为一个宠物项目,我一直在编写自己的ORM,以帮助我更好地理解Peewee等生产级ORM或更复杂的sqlalchemy所做的决定。

与我的标题问题一致,是否最好生成一个游标并将其重用于多个SQL执行或为每个事务生成一个新的游标?

我已经猜到了避免状态问题(没有提交的事务),但是还有另一个原因为什么每个操作(插入,更新,选择,删除或创建)最好有一个游标吗?

1 个答案:

答案 0 :(得分:1)

您是否进行了分析并发现创建游标是开销的重要来源?

游标是DB-API 2.0工件,不一定是存在的实际“事物”。它们旨在为执行查询和处理结果/迭代提供通用接口。如何在后台实现它们取决于数据库驱动程序。如果您打算支持与DB-API 2.0兼容的驱动程序,建议您仅使用cursor()方法为每次查询执行创建一个游标。我建议不要使用单例或共享游标。

例如,在SQLite中,游标本质上是sqlite3_stmt对象的包装,因为没有“ sqlite3_cursor”之类的东西。 stdlib sqlite3驱动程序维护sqlite3_stmt对象的内部缓存,以避免编译频繁使用的查询的开销。