You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Pandas至0.24.0后pd.read_sql报MySQL OperationalError求助

问题原因分析及解决方案

嘿,我之前也碰到过一模一样的问题!这其实是Pandas 0.24.0对pd.read_sql()的内部逻辑做了调整导致的。

为什么会出现这个报错?

在Pandas 0.23.4及更早版本中,pd.read_sql()会自动识别传入的字符串是查询语句还是表名,然后对应调用read_sql_query()read_sql_table()。但升级到0.24.0后,这个判断逻辑变严格了:它会先尝试把传入的字符串当成表名,去执行DESCRIBE命令获取表结构。而你的查询语句(比如select max(run_ts) from ...)显然不是合法的表名,MySQL自然会抛出“标识符太长”的错误。

快速解决办法

有两个简单的方案可以直接搞定这个问题:

1. 直接使用pd.read_sql_query()替代pd.read_sql()

既然你明确要执行的是查询语句,不如直接调用专门的查询方法,跳过Pandas的自动判断逻辑:

import pandas as pd
from sqlalchemy import create_engine

db_engine = create_engine('mysql+mysqldb://<>/product_analytics', echo=False)
result = pd.read_sql_query('select max(run_ts) from product_analytics.xlations_topic_update_status', con=db_engine).values[0][0]

2. 用SQLAlchemy的text()包裹查询语句

从SQLAlchemy导入text,把你的查询语句包装成SQL表达式对象,这样Pandas就不会把它当成表名处理了:

import pandas as pd
from sqlalchemy import create_engine, text

db_engine = create_engine('mysql+mysqldb://<>/product_analytics', echo=False)
result = pd.read_sql(text('select max(run_ts) from product_analytics.xlations_topic_update_status'), con=db_engine).values[0][0]

额外小提示

如果你的查询语句末尾带了分号,建议去掉——虽然这不是直接原因,但可能会加重Pandas的判断混淆,比如select ...;这种格式更容易被误判为奇怪的标识符。

内容的提问来源于stack exchange,提问作者Peter

火山引擎 最新活动