在 Alembic 数据迁移工具中,DEFERRABLE INITIALLY IMMEDIATE 是 PostgreSQL 数据库的一个选项,它用于设置提交事务时是否检查约束。如果设置为 IMMEDIATE,则在提交事务之前会立即检查所有约束。如果设置为 DEFERRABLE,那么在提交事务之前不会检查所有约束。
下面的示例代码演示了如何在 Alembic 1.8 中使用 DEFERRABLE INITIALLY IMMEDIATE:
from alembic import op
# 设置 DEFERRABLE INITIALLY IMMEDIATE
def upgrade():
op.create_table(
'my_table',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String),
sa.CheckConstraint('name != "invalid"', name='no_invalid_names', deferrable=True, initially='immediate'),
)
# 删除表
def downgrade():
op.drop_table('my_table')
这段代码创建了一个名为 my_table 的表格,并设置了一个名为 no_invalid_names 的约束。在这个约束中,我们设置了 DEFERRABLE 和 IMMEDIATE 以确保在插入无效名称之前立即检查其有效性。
如果您想延迟检查约束,可以使用 DEFERRABLE 和 DEFERRED,如下所示:
sa.CheckConstraint('name != "invalid"', name='no_invalid_names', deferrable=True, initially='deferred')
这样,在提交事务之前就不会检查约束了。