【问题标题】:Alembic Primary Key issue with mssql ( Azure Synapse SQL DW )mssql (Azure Synapse SQL DW) 的 Alembic 主键问题
【发布时间】:2021-11-20 20:04:48
【问题描述】:

我正在尝试使用 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')

【问题讨论】:

  • 您可以尝试在 alembic.ini 的 [alembic] 部分添加一行 version_table_pk = false 看看是否有帮助。
  • @GordThompson 该设置似乎没有任何效果

标签: sqlalchemy alembic azure-synapse


【解决方案1】:

适用于 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 关键字。

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

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
);

您做出的选择取决于数据量和最佳使用情况hereROUND_ROBINCLUSTERED COLUMNSTORE INDEX 是默认值。如果框架不能为您提供灵活性,请考虑制定这些语句而不是使用框架。

【讨论】:

    【解决方案2】:

    通过执行以下操作,我能够禁止在 alembic_version 表上创建主键:

    编辑 env.py 并将version_table_pk=False 选项添加到run_migrations_online() 函数中的context.configure() 调用。也就是这个……

        with connectable.connect() as connection:
            context.configure(
                connection=connection, target_metadata=target_metadata
            )
    

    …变成这个

        with connectable.connect() as connection:
            context.configure(
                connection=connection, target_metadata=target_metadata,
                version_table_pk=False
            )
    

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 2021-08-26
      • 2021-11-15
      • 2017-07-28
      • 2021-03-18
      • 2020-12-27
      • 2021-12-23
      • 2023-03-07
      • 2020-12-13
      相关资源
      最近更新 更多