如何在SQLALchemy Core中“设置CONSTRAINTS … DEFERRED”
|
我正在使用SQLAlchemy和PostgreSQL. Postgres支持执行延迟约束,这允许我们推迟检查表上的约束,直到事务结束.
例如,在SQLAlchemy中,我可能会定义一个这样的表: t_group_categories = Table('group_categories',metadata,Column('id',Integer,primary_key=True),Column('group_id',ForeignKey('groups.id',deferrable=True))
)
SQLAlchemy会生成一个CREATE TABLE语句,它看起来像: CREATE TABLE group_categories
(
id serial NOT NULL,group_id integer,CONSTRAINT group_categories_pkey PRIMARY KEY (id),CONSTRAINT group_categories_group_id_fkey FOREIGN KEY (group_id)
REFERENCES groups (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE
)
根据我的理解,DEFERRABLE INITIALLY IMMEDIATE意味着FOREIGN KEY约束 问题是我似乎无法找到任何有关如何让SQLAlchemy核心在事务内部实际发出SET CONSTRAINTS … DEFERRED命令的信息. connection = engine.connect()
...
with connection.begin() as transaction:
# Create a group
r = connection.execute(
t_groups.insert().values(...)
)
group_id = r.inserted_primary_key
# Assign a category to the group (ERROR!)
r2 = connection.execute(
t_group_categories.insert().values(group_id=group_id,...)
)
第一个块只是创建一个新组.然后第二个块尝试分配该组 我想在这个实例中做的是推迟检查约束直到事务提交之后. 笔记: >问题在 更新: >执行connection.execute(“SET CONSTRAINTS ALL DEFERRED”)似乎也没有任何效果;我仍然遇到IntegrityError. 解决方法
如
this question中所述,外键约束
can’t be deferred,即使它们被声明为:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
