使用SQLAlchemy的SQLite PRAGMA foreign_keys

时间:2013-04-21 16:29:56

标签: sqlite sqlalchemy

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

最终,我刚刚熟悉了ORM,并没有太多时间弄脏SQLAlchemy Core。当我导入我的Declarative模块时,有一个导入确保我的全局引擎已经启动。除此之外,我不接触引擎/池/会话。

我找到了这个参考: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或PRAGMA关闭......

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

你如何'取消'这个事件(看起来更干净)?

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

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

  

外键约束强制执行只能启用或禁用   当没有待处理的BEGIN或SAVEPOINT时


相关副标题: 在第二个注释中,一旦我找到了PRAGMA,我是否仍然可以使用SQLAlchemy ORM实例来处理表(使用foreign_keys = OFF)? SQLAlchemy本身不强制执行密钥完整性吗?如何让SQLAlchemy暂时忽略外键?

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

1 个答案:

答案 0 :(得分:1)

我们目前没有事件“删除”的显式API,尽管这是一个最终可用的功能。所以你需要创建一个单独的事件,它本身会根据一个标志打开和关闭,看起来就像你已经解决过的那样。