sqlalchemy - 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')
解决方案
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
| ) ,例如,该语句将具有与上述相同的结果,但它是明确的和自记录的:HEAP
WITH
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
是默认值。如果框架不能为您提供灵活性,请考虑制作这些语句而不是使用框架。
推荐阅读
- javascript - 来自mysql数据库的PHP动态图表数据
- html - 为什么我的 html 图像 scr 搜索的是 url 而不是我的目录?
- visual-studio - unity Camera 垂直滚动效果
- java - SASL_SSL 安全协议如何工作?客户端是否验证服务器(X.509 证书)?
- android - 有没有一种有效的方法将 Firebase 数据存储在 arraylist 中然后读取它?
- bash - 在 IFS 命令后读取时,奇怪的错误值对于基础来说太大了
- deserialization - YamlDotNet 可以反序列化为动态对象图吗?
- reactjs - 数据未在 Material UI DataGrid 中加载 - React
- arrays - 使用mergesort对数组进行排序得到stackoverflow
- swift - swiftui 致命错误:尝试创建没有子图的属性