使用alembic为Azure Synapse SQL DW做迁移时报事务不存在错误
错误原因
- Azure Synapse Analytics 专用SQL池(原Azure Synapse DW)的事务机制与常规SQL Server存在差异,绝大多数DDL语句执行后会自动触发隐式事务提交。Alembic默认会开启顶层事务包裹所有迁移操作,当你执行
create_table这类DDL语句时,Synapse已经自动将Alembic开启的事务提交关闭,后续Alembic尝试主动提交事务时就会找不到对应事务,抛出111214报错。 - 默认SQLAlchemy pyodbc驱动的事务配置未适配Synapse特性,自动提交逻辑与Alembic的事务管理存在冲突。
解决方案
1. 调整Alembic全局事务配置
找到Alembic项目根目录下的env.py文件,修改run_migrations_online函数内的上下文配置,禁用全局事务包裹、开启自动提交:
def run_migrations_online(): connectable = engine_from_config( config.get_section(config.config_ini_section), prefix="sqlalchemy.", poolclass=pool.NullPool, ) with connectable.connect() as connection: context.configure( connection=connection, target_metadata=target_metadata, # 新增以下2行配置 transaction_per_migration=False, autocommit=True ) # 可选:如果修改后仍报错,可删除下方的事务包裹逻辑,直接执行context.run_migrations() with context.begin_transaction(): context.run_migrations()
2. 调整数据库连接字符串
在alembic.ini的连接字符串末尾添加autocommit=True参数,适配Synapse的事务逻辑:
sqlalchemy.url = mssql+pyodbc:///?odbc_connect=Driver={ODBC Driver 17 for SQL Server};Server=tcp:{host},1433;Database={database};Uid=sqladminuser;Pwd={Password};Encrypt=yes;TrustServerCertificate=no;Connection+Timeout=30;autocommit=True;
3. 单迁移适配方案(可选)
如果仅部分迁移脚本涉及DDL操作需要适配,不需要修改全局配置,可以直接在对应迁移脚本的顶部添加配置,单独关闭当前迁移的事务管理:
from alembic import op import sqlalchemy as sa # 新增该行配置,开启自动提交 op.get_context().autocommit = True def upgrade(): op.create_table( 'test', 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('test')
内容的提问来源于stack exchange,提问作者ASHISH M.G
相关产品推荐
相关产品推荐

