SQLite 中的文件锁

Odd*_*ing 4 python sqlite sqlalchemy

我正在编写我的第一个 SQLAlchemy (0.6.8)/Python (2.7.1) 程序,它位于 SQLite(我认为是 3.7.6.3)之上,在 Windows Vista 上运行。

为了执行单元测试,我将 SQLite 指向一个测试数据库,并且我的单元测试脚本会定期删除数据库文件,因此我一直在使用已知的初始状态。

有时我的(单线程)单元测试无法删除文件:

WindowsError: [Error 32] The process cannot access the file because it is being used by another process
Run Code Online (Sandbox Code Playgroud)

使用该文件的唯一进程是单元测试工具。显然,我完成的一个单元测试没有释放某些锁,从而防止同一进程中的下一个单元测试删除文件。

我已经搜索了所有创建会话的地方,并确认有相应的 session.commit() 或 session.rollback()。

我在我的代码中搜索了所有 session.commit() 和 session.rollback() 调用,然后立即添加了 session.close() 调用,试图显式释放任何事务锁,但没有帮助。

是否有任何秘密可以确保在事务结束时删除剩余的锁以允许删除文件?

Kal*_*zar 5

有人有类似的问题:http : //www.mail-archive.com/sqlalchemy@googlegroups.com/msg20724.html

您应该在连接建立时使用 NullPool 以确保在之后没有活动连接停留 session.close()

from sqlalchemy import create_engine
from sqlalchemy.pool import NullPool

to_engine = create_engine('sqlite:///%s' % temp_file_name, poolclass=NullPool)
Run Code Online (Sandbox Code Playgroud)

参考:http : //www.sqlalchemy.org/docs/06/core/pooling.html? highlight= pool#sqlalchemy.pool

这仅在 0.7.0 之前的 SQLAlchemy 中是必需的。在 0.7.0 之后,这成为 SQLite 的默认行为。参考:http : //www.sqlalchemy.org/docs/core/pooling.html? highlight= pool#sqlalchemy.pool