Sqlite / SQLAlchemy:如何強制執(zhí)行外鍵?新版本的SQLite能夠強制執(zhí)行外鍵約束,但為了向后兼容,您必須分別為每個數(shù)據(jù)庫連接打開它!sqlite> PRAGMA foreign_keys = ON;我正在使用SQLAlchemy - 我怎樣才能確保它始終打開?我試過的是這個:engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)engine.execute('pragma foreign_keys=on')......但它不起作用!...我錯過了什么?編輯: 我認為我的真正問題是我安裝了多個版本的SQLite,并且Python沒有使用最新的版本!>>> import sqlite3>>> print sqlite3.sqlite_version3.3.4但我剛剛下載了3.6.23并將exe放在我的項目目錄中!我怎樣才能弄清楚它正在使用哪個.exe并進行更改?
3 回答

楊__羊羊
TA貢獻1943條經(jīng)驗 獲得超7個贊
對于最新版本(SQLAlchemy~0.7),SQLAlchemy主頁說:
不推薦使用PoolListener。請參閱PoolEvents。
然后CarlS的例子成為:
engine = create_engine(database_url)def _fk_pragma_on_connect(dbapi_con, con_record): dbapi_con.execute('pragma foreign_keys=ON')from sqlalchemy import eventevent.listen(engine, 'connect', _fk_pragma_on_connect)

湖上湖
TA貢獻2003條經(jīng)驗 獲得超2個贊
基于conny和shadowmatter的答案,這里的代碼將在發(fā)出PRAGMA語句之前檢查您是否使用SQLite3:
from sqlalchemy import eventfrom sqlalchemy.engine import Enginefrom sqlite3 import Connection as SQLite3Connection@event.listens_for(Engine, "connect")def _set_sqlite_pragma(dbapi_connection, connection_record): if isinstance(dbapi_connection, SQLite3Connection): cursor = dbapi_connection.cursor() cursor.execute("PRAGMA foreign_keys=ON;") cursor.close()
添加回答
舉報
0/150
提交
取消