我現在使用 Alembic 1.8、SQLAlchemy 1.4 和 PostgreSQL
我想將我的 FK 約束設定為“DEFERRABLE INITIALLY IMMEDIATE”。
我通過了 FK 選項,如下所示:
sa.Column(
"group_id",
sa.BigInteger,
sa.ForeignKey(
"auth_group.id",
onupdate="CASCADE",
ondelete="CASCADE",
deferrable=True,
initially="IMMEDIATE"
),
index=True,
),
它像這樣生成我的“創建表”SQL:
CONSTRAINT auth_user_groups_group_id_fkey FOREIGN KEY (group_id)
REFERENCES public.auth_group (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE,
DEFERRABLE
我期望“DEFERRABLE INITIALLY IMMEDIATE”而不是“DEFERRABLE”。
請讓我知道如何將約束設定為“DEFERRABLE INITIALLY IMMEDIATE”。
謝謝你。
uj5u.com熱心網友回復:
這是您的 DDL -> 文本生成器的問題(或設計選擇) - 而不是 sqlalchemy。
Postgres 使用的實際約束資訊存盤在表中pg_catalog.pg_constraint。如果您查看pg_constraint table 的檔案,您會注意到可延遲性的概念(v7.2-v15 )完全由兩個布爾列condeferrable和condeferred.
因此,如果一個約束是DEFERRABLE并且它不是INITIALLY DEFERRED(檢查事務結束),它只能是INITIALLY IMMEDIATE(檢查陳述句結束)。
如果你想絕對確定,你可以運行這個簡單的查詢:
SELECT
pgc.conname constraint_name,
pgc.confrelid::regclass tbl_name,
CASE
WHEN pgc.condeferrable
THEN
CASE
WHEN pgc.condeferred
THEN 'DEFERRABLE INITIALLY DEFERRED'
ELSE 'DEFERRABLE INITIALLY IMMEDIATE'
END
ELSE 'NOT DEFERRABLE'
END deferrability
FROM
pg_catalog.pg_constraint pgc
WHERE
conname = 'auth_user_groups_group_id_fkey'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491461.html
