【问题标题】:SQLite PRAGMA foreign_keys with SQLAlchemySQLite PRAGMA foreign_keys 与 SQLAlchemy
【发布时间】:2013-04-21 16:29:55
【问题描述】:

在执行某些操作之前,我需要将 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 也暂时忽略外键?

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

【问题讨论】:

    标签: sqlite sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 澄清一下:由于此事件发生在新连接上,那么强制建立新连接的最快方法是什么? session.commit()?我想从尽可能高的位置做这件事。
    • 如果你有 NullPool 正在使用,那么确定
    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2016-10-14
    • 2013-10-12
    • 2021-01-30
    相关资源
    最近更新 更多