Из-за того, как pysqlite или модуль sqlite3
работает, SQLAlchemy по умолчанию использует NullPool
с файловыми базами данных .Это объясняет, почему ваша база данных расшифровывается для каждого запроса: NullPool
отбрасывает соединения, когда они закрыты.Причина, по которой это делается, заключается в том, что стандартное поведение pysqlite запрещает использование соединения в более чем одном потоке, и без шифрования создание новых соединений происходит очень быстро.
Pysqlite имеет недокументированный флаг check_same_thread
, который можетможно использовать для отключения проверки, но совместное использование соединений между потоками следует обрабатывать с осторожностью, а в документации SQLAlchemy упоминается, что NullPool
хорошо работает с блокировкой файлов SQLite.
В зависимости от вашего веб-сервера вы можетеиспользуйте SingletonThreadPool
, что означает, что все соединения в потоке - это одно и то же соединение:
engine = create_engine('sqlite:///my.db',
poolclass=SingletonThreadPool)
Если вы чувствуете себя авантюрным и ваш веб-сервер не разделяет соединения / сеансы между потоками во время использования (например,используя сессию с определенными областями), то вы можете попробовать использовать другую стратегию объединения в пару с check_same_thread=False
:
engine = create_engine('sqlite:///my.db',
poolclass=QueuePool,
connect_args={'check_same_thread':False})