Alembic向Azure Synapse SQL DW迁移时报主键约束不支持错误
问题原因
Azure Synapse 专用SQL池不支持传统强制生效的主键、唯一约束,所有这类约束必须指定NOT ENFORCED语法才允许创建。报错来自两个场景:一是Alembic自动创建的版本控制表alembic_version的默认主键约束没有加该语法,二是迁移脚本里定义的dqrule表主键也没有加对应配置。
解决步骤
- 手动提前创建符合Synapse要求的
alembic_version表,避免Alembic自动创建时触发报错,在目标库执行以下SQL:
CREATE TABLE alembic_version ( version_num VARCHAR(32) NOT NULL, CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num) NOT ENFORCED );
- 修改迁移脚本的主键定义,增加
NOT ENFORCED配置,SQLAlchemy针对SQL Server语法支持指定mssql_not_enforced参数,调整后的迁移文件内容如下:
import sqlalchemy as sa from alembic import op # revision identifiers, used by Alembic. revision = '6c51cb206ea6' down_revision = None branch_labels = None depends_on = None def upgrade(): op.create_table( 'dqrule', sa.Column('id', sa.Integer, nullable=False), sa.Column('description', sa.String, nullable=False), sa.Column('source_type', sa.String, nullable=False), sa.Column('source_schema', sa.String, nullable=False), sa.Column('source_entity', sa.String, nullable=False), # 自定义主键约束,增加Synapse要求的NOT ENFORCED参数 sa.PrimaryKeyConstraint('id', mssql_not_enforced=True) ) def downgrade(): op.drop_table('dqrule')
- 后续所有创建主键、唯一约束的迁移,都需要在约束定义中加上
mssql_not_enforced=True参数,避免重复触发报错。 - 重新执行
alembic upgrade head即可正常完成迁移。
内容的提问来源于stack exchange,提问作者ASHISH M.G
相关产品推荐
相关产品推荐

