Python和SQL炼金术:如何在.to_sql调用中获取语句

g52tjvyc  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(166)

当sqlalchemy *.to_sql语句在没有try-except的情况下出错时,错误语句将打印到控制台。
我想捕获错误语句并将其发送给日志记录器。logger.error()中返回错误原因和错误语句的值是什么?

try:
        a.to_sql(name="lar", schema="lar", con=engine, if_exists="append", index=False)
 except sqlalchemy.exc.SQLAlchemyError:
        logging.error(sqlalchemy.exc.SQLAlchemyError)
        break

如果没有try块,控制台将获得:(这是我在日志记录器中想要的)

sqlalchemy.exc.DataError: (pymysql.err.DataError) (1366, "Incorrect decimal value: 
'Exempt' for column 'combined_loan_to_value_ratio' at row 1")

[SQL: INSERT INTO lar.lar  .... etc., ....
368yc8dk

368yc8dk1#

从DBAPIError继承的异常(如DataError)拥有属性origstatement,这两个属性分别包含原始DB-API错误消息和正在执行的SQL语句。

try: 
    a.to_sql(...)
except sqlalchemy.exc.DBAPIError as ex:
    logger.error('%s \n %s', ex.orig, ex.statement)

生成如下所示的日志消息:

ERROR:mylogger:(1366, "Incorrect decimal value: 'foo' for column `test`.`t75264888`.`ltv` at row 1") 
 INSERT INTO t75264888 (ltv) VALUES (%(ltv)s)

相关问题