SQLAlchemy+Pandas参数化查询执行报错求助
SQLAlchemy查询触发回滚错误排查
问题代码
import pandas as pd from sqlalchemy import create_engine host = "xxxx.us-west-2.rds.amazonaws.com" user = "user1" pwd = "xxx" database = "db1" engine = create_engine("mysql+pymysql://{}:{}@{}/{}".format(user,pwd,host,database), echo=True) query1 = """ select * from tbl1 where dt <= :cutoff_dt """ params={ "cutoff_dt": "2023-9-30" } # 开启事务并创建会话 with engine.begin() as conn: try: # 执行查询 df1 = pd.read_sql( query1, conn, params=params ) except Exception as e: # 处理错误 print(f"发生错误: {e}") conn.rollback() # 发生错误时回滚事务 finally: # 关闭连接,即使无错误也显式回滚(更安全) conn.close() # 即使无错误也显式关闭连接
错误信息
[参数: {'cutoff_dt': '2023-9-30'}]
错误背景详情:SQLAlchemy数据库操作错误(错误码f405)
2024-02-13 11:14:16,745 INFO sqlalchemy.engine.Engine ROLLBACK
排查与解决方法
错误码f405对应SQLAlchemy的编程错误,常见原因及修复方案如下:
参数类型不匹配:
传递的cutoff_dt是字符串,若数据库dt字段为日期/时间类型,可能因隐式转换失败触发错误。建议用Pythondatetime对象传递参数:from datetime import datetime params = {"cutoff_dt": datetime(2023, 9, 30)}SQL语法或对象不存在:
检查tbl1表是否存在、dt字段名称是否正确,或直接在数据库客户端执行查询语句,验证语法有效性。冗余事务处理:
engine.begin()上下文管理器会自动处理事务:异常时自动回滚,正常时自动提交,离开上下文自动关闭连接。手动调用conn.rollback()和conn.close()属于冗余操作,可能引发异常,简化后的代码如下:with engine.begin() as conn: try: df1 = pd.read_sql(query1, conn, params=params) except Exception as e: print(f"发生错误: {e}")
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

