重用 sqlite3 游标的副作用是什么?



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

根据我的标题问题,生成一个游标并将其重用于多个 SQL 执行还是为每个事务生成一个新游标更好?

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

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

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

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

最新更新