SQLAlchemy2.0中解决SQLite3外键约束无效问题

SQLite3作为一款轻量级的关系型数据库,号称是部署最广泛的数据库引擎。在python2.5以后的版本中都内置了这个引擎,令其可以开箱即用,实际上带来更广的应用场景。

但使用中存在存在一个问题,就是因与早期版本兼容SQLite3 的外键约束机制一直都是关着的。如今在用python3.10了,其中SQLite3 模块版本为3.37.2,今天用SQLAlchemy 试了一下,发现仍然有这个外键约束无效的装况。

针对性地搜索了一圈以前的解决方案,答案还是一致的,即在引擎环境中手动将“外键约束"打开:

sqlite> PRAGMA foreign_keys = ON;

而在python+SQLAlchemy的编程场景中有下面这个方法,但在SQLAlchemy2.0版本下也不适用了。

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()])

 最终还是在SQLAlchemy2.0 的文档中查找到了更新的解决方案,现在采用的是事件捕获装饰器的方法,好像是高级了一些。

from sqlalchemy.engine import Engine
from sqlalchemy import event

@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
    cursor = dbapi_connection.cursor()
    cursor.execute("PRAGMA foreign_keys=ON")
    cursor.close()
以上代码配合使用SQLAlchemy ORM 的脚本测试有效,在违反“外键约束”的情况下增加记录就会抛出错误信息:
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) FOREIGN KEY constraint failed
[SQL: INSERT INTO .....................................]

顺便做个笔记,供需要的同学分享。 

你可能感兴趣的:(sqlite,数据库,python)