使用WRDS库v3.1.2时连接出现AttributeError衍生的ObjectNotExecutableError问题
WRDS库v3.1.2时连接出现AttributeError衍生的ObjectNotExecutableError问题
问题分析
从你提供的错误栈能明确看出,问题根源出在WRDS库v3.1.2的load_library_list()方法里:它直接把原始SQL字符串传给了SQLAlchemy的connection.execute()方法,但在较新的SQLAlchemy版本(尤其是2.0+)中,已经不再支持直接执行字符串形式的查询,必须将字符串包装成SQLAlchemy的text()对象才能执行。
这就是为什么你用v3.1.1能正常工作,升级到v3.1.2就报错——WRDS团队在最新版本的代码里可能遗漏了对SQLAlchemy 2.0+兼容性的处理,没有给那个查询字符串做必要的包装。
解决方案
这里有几个可行的解决办法:
降级WRDS库到v3.1.1
既然你已经确认v3.1.1版本可以正常运行,这是最直接的临时方案。执行以下命令降级:pip install wrds==3.1.1手动修补WRDS库的代码
如果你想继续使用v3.1.2,可以修改WRDS库中出错的文件:- 找到你的conda环境中WRDS库的
sql.py文件(路径类似~\anaconda3\envs\playground\lib\site-packages\wrds\sql.py) - 打开文件,定位到
load_library_list()方法中的这一行:cursor = self.connection.execute(query) - 修改为以下内容(先导入
text工具,再包装查询字符串):from sqlalchemy import text cursor = self.connection.execute(text(query))
这样就把原始字符串查询转换成了SQLAlchemy可识别的执行对象,解决兼容性问题。
- 找到你的conda环境中WRDS库的
等待WRDS官方修复
这明显是WRDS库v3.1.2的一个兼容性bug,你可以在WRDS的官方代码仓库提交issue反馈,或者关注他们的版本更新,等待官方发布修复版本。
额外说明
这个错误的核心是SQLAlchemy 2.0+的API变更:不再接受原始字符串作为execute()的参数,必须使用text()、ORM查询或其他标准可执行对象。WRDS v3.1.2的代码没有适配这个变化,才导致了报错。
备注:内容来源于stack exchange,提问作者shenflow
相关产品推荐
相关产品推荐

