You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:09:05