如何在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,即使它们被声明为:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |