SQLAlchemy中select ... into执行无效果,是否支持及求替代方案?
SQLAlchemy中执行SELECT...INTO语句无报错但未生成表的问题解决
问题原因
SQLAlchemy通过engine.connect()创建的连接默认处于事务模式,执行SELECT...INTO这类DDL操作后,若未显式提交事务,事务会在上下文结束时自动回滚,导致表无法被持久化创建。而普通SELECT查询不需要提交就能返回结果,所以你会看到其他查询正常执行。
是否支持用text执行SELECT...INTO?
完全支持,问题仅出在事务提交环节,而非语句本身的兼容性。
替代方案(除分开CREATE和INSERT外)
- 显式提交事务:在执行语句后手动调用
commit()方法完成事务提交with engine.connect() as cx: cx.execute(text(''' select name into testing.test from core.person ''')) cx.commit() # 手动提交事务,确保表被持久化 - 使用
engine.begin()自动管理事务:begin()上下文管理器会在代码块正常执行完成后自动提交事务,发生异常时自动回滚,无需手动处理提交逻辑with engine.begin() as cx: cx.execute(text(''' select name into testing.test from core.person ''')) # 无需手动调用commit,上下文会自动处理事务 - 全局开启自动提交(不推荐生产环境):创建引擎时设置
autocommit=True,让所有操作自动提交,但这会失去事务的原子性保障,仅适合单步独立操作场景engine = create_engine( 'mssql+pyodbc:///?odbc_connect={}'.format(conn), autocommit=True ) with engine.connect() as cx: cx.execute(text(''' select name into testing.test from core.person '''))
内容的提问来源于stack exchange,提问作者philipnye
相关产品推荐
相关产品推荐

