重用 sqlite3 游标有哪些副作用?

Dav*_*vid 6 python sqlite orm

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

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

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

col*_*fer 4

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

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

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

  • 只要开销存在,开销是否很大并不重要。许多小的开销很快就会积累起来。这就是为什么今天的计算机需要 2 GHz 来完成二十年前使用 400 MHz 在相同时间内完成的任务。由于创建实例总是比不创建实例需要更多的工作,因此我看不出这样做的理由。正如您自己所说,游标是一种工件,实际上并没有做任何事情,并且仅使用一个游标可以使代码更加清晰。 (2认同)