У меня теперь это работает:
Загрузите последние сборки sqlite и pysqlite2, как описано выше: убедитесь, что Python использует правильные версии во время выполнения.
import sqlite3
import pysqlite2
print sqlite3.sqlite_version # should be 3.6.23.1
print pysqlite2.__path__ # eg C:\\Python26\\lib\\site-packages\\pysqlite2
Далее добавьте PoolListener:
from sqlalchemy.interfaces import PoolListener
class ForeignKeysListener(PoolListener):
def connect(self, dbapi_con, con_record):
db_cursor = dbapi_con.execute('pragma foreign_keys=ON')
engine = create_engine(database_url, listeners=[ForeignKeysListener()])
Тогда будьте осторожны, как вы проверяете, работают ли внешние ключи: у меня была некоторая путаница здесь. При использовании sqlalchemy ORM для добавления () вещей мой код импорта неявно обрабатывал связи с отношениями, поэтому никогда не мог завершиться неудачей. В этом мне помогло добавление nullable = False к некоторым операторам ForeignKey ().
Способ проверки поддержки внешнего ключа sqlalchemy sqlite - выполнить ручную вставку из декларативного класса ORM:
# example
ins = Coverage.__table__.insert().values(id = 99,
description = 'Wrong',
area = 42.0,
wall_id = 99, # invalid fkey id
type_id = 99) # invalid fkey_id
session.execute(ins)
Здесь 'wall_id' и 'type_id' - это ForeignKey () и sqlite теперь правильно генерируют исключение, если пытаются подключить недействительные fkeys. Так что это работает! Если вы удалите слушателя, то sqlalchemy с радостью добавит неверные записи.
Я полагаю, что основная проблема может заключаться в множественных файлах sqlite3.dll (или .so).