首页 > 解决方案 > mssql (Azure Synapse SQL DW) 的 Alembic 主键问题

问题描述

我正在尝试使用 alembic 将迁移应用到 Azure Synapse SQL DW。我在执行时面临以下问题alembic upgrade head

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Enforced unique constraints are not supported. To create an unenforced unique constraint you must include the NOT ENFORCED syntax as part of your statement. (104467) (SQLExecDirectW)')
[SQL: 
CREATE TABLE alembic_version (
        version_num VARCHAR(32) NOT NULL, 
        CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
)

]
(Background on this error at: https://sqlalche.me/e/14/f405)

我的版本文件是:

import sqlalchemy as sa


# 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, primary_key=True),
        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)
    )


def downgrade():
    op.drop_table('dqrule')

标签: sqlalchemyalembicazure-synapse

解决方案


Azure Synapse Analytics 的有效 SQL 语句,专用 SQL 池将是:

CREATE TABLE alembic_version (
        version_num VARCHAR(32) NOT NULL, 
        CONSTRAINT alembic_version_pkc PRIMARY KEY NONCLUSTERED (version_num) NOT ENFORCED
);

根据错误消息,专用 SQL 池不支持唯一约束,但您可以使用NOT ENFORCED关键字创建它们。也不支持集群主键,因此您必须添加NONCLUSTERED关键字。

您可能还应该在一个子句中指定分布( ROUND_ROBIN| HASH| REPLICATE)和索引类型(CLUSTERED COLUMNSTORE INDEX| CLUSTERED INDEX| ) ,例如,该语句将具有与上述相同的结果,但它是明确的和自记录的:HEAPWITH

CREATE TABLE alembic_version (
        version_num VARCHAR(32) NOT NULL, 
        CONSTRAINT alembic_version_pkc PRIMARY KEY NONCLUSTERED (version_num) NOT ENFORCED
)
WITH (
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

您所做的选择取决于此处最好描述的数据量和使用情况。 ROUND_ROBIN并且CLUSTERED COLUMNSTORE INDEX是默认值。如果框架不能为您提供灵活性,请考虑制作这些语句而不是使用框架。


推荐阅读