python - SQLite 中的文件锁

标签 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

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

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

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

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

最佳答案

有人遇到过类似的问题: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)

引用: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

关于python - SQLite 中的文件锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134980/

相关文章:

python-2.7 - 是否有可能同时具有一对多和多对多关系的模型?

python - 具有大值的 numpy linalg.lstsq

python - 理解 numpy 数组行为的困难

android - Android设备电话号码的位置

php - PHP/Sqlite3进程同步

android - 如何从 SQLite Openhelper 调试 SQLite 数据库?

python - 哪种 DBDriver 适用于 Python3x 和 SQLAlchemy0.8 for MySQL?

python - 在同一单元格中绘制图

python - 向量到矩阵的余弦距离

python - sqlalchemy.exc.ArgumentError : columns argument to select() must be a Python list or other iterable