Блокировка файлов в SQLite - PullRequest
4 голосов
/ 26 мая 2011

Я пишу свою первую программу SQLAlchemy (0.6.8) / Python (2.7.1), сидящую поверх SQLite (я думаю, 3.7.6.3), работающую в Windows Vista.

InЧтобы выполнить модульное тестирование, я указываю SQLite на тестовую базу данных, и мои скрипты модульного теста регулярно удаляют файл базы данных, поэтому я постоянно работаю с известным начальным состоянием.

Иногда моймодульные тесты не могут удалить файл:

WindowsError: [Error 32] The process cannot access the file because it is being used by another process

Единственный процесс, который использует файл, - это модуль модульного тестирования.Ясно, что некоторые из моих завершенных модульных тестов не снимают блокировку, что мешает следующему модульному тесту в том же процессе удалить файл.

Я искал все места, где создал сеанс, иподтвердил, что существует соответствующий session.commit () или session.rollback ().

Я искал все вызовы session.commit () и session.rollback () в своем коде и сразу после этого добавил вызов session.close (), пытаясь явно снять любые транзакционные блокировки, ноэто не помогло.

Есть ли секреты, обеспечивающие удаление оставшихся блокировок в конце транзакции, чтобы разрешить удаление файла?

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

У кого-то была похожая проблема: http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg20724.html

Вы должны использовать NullPool при установлении соединения, чтобы гарантировать, чтопосле 10000 *

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

Это требуется только в SQLAlchemy до 0.7.0.После 0.7.0 это стало поведением по умолчанию для SQLite.Справка: http://www.sqlalchemy.org/docs/core/pooling.html?highlight=pool#sqlalchemy.pool

1 голос
/ 26 мая 2011

Требуется ли вам общий доступ к базе данных во время модульных тестов? Если нет, используйте базу данных SQLite в памяти для этих тестов. Из документации по SQLAlchemy :

Идентификатор sqlite: memory: используется по умолчанию, если путь к файлу отсутствует. Укажите sqlite: // и ничего больше:

# in-memory database
e = create_engine('sqlite://')

Нет необходимости управлять временными файлами, нет семантики блокировок, гарантированно чистый лист между юнит-тестами и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...