0

在执行某些操作之前,我需要将 PRAGMA foreign_keys 的值更改为“关闭”,但随后我想将其重新“打开”。

最终,我只是刚刚熟悉了 ORM,并没有太多时间去了解 SQLAlchemy Core。当我导入声明性模块时,有一个导入可以确保我的全局引擎已启动。除此之外,我不接触引擎/池/会话。

我找到了这个参考:How to turn on 'PRAGMA foreign_keys = ON' in sqlalchemy migration script or configuration file for sqlite?

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

我可以将其粘贴在我的全局引擎配置中,然后使用 PRAGMA on 或 PRAGMA off 的开关...

    if self.enforceDBFK:
        cursor.execute("PRAGMA foreign_keys=ON")
    else:
        cursor.execute("PRAGMA foreign_keys=OFF")

你如何“不听”事件(看起来更干净)?

有关如何执行此操作的任何其他建议。

SQLite 文档中关于 PRAGMA foreign_keys 的注释:

只有在没有挂起的 BEGIN 或 SAVEPOINT 时,才能启用或禁用外键约束强制


相关子主题: 第二个注意事项,一旦我弄清楚了 PRAGMA,我还可以使用 SQLAlchemy ORM 实例来处理表(使用 foreign_keys=OFF)吗?SQLAlchemy 本身并不强制执行密钥完整性,对吗?如何让 SQLAlchemy 也暂时忽略外键?

我只需要更新一堆行,但是在更新作为一个组完成之前,整个地方都会有损坏/重叠的引用。

4

1 回答 1

1

我们目前没有用于事件“删除”的明确 API,尽管这是最终将可用的功能。因此,您需要创建一个单独的事件,该事件本身会根据标志自行打开和关闭,看起来这就是您已经解决的问题。

于 2013-04-22T17:17:39.093 回答