使用pandasql执行SQL查询报错:'str'对象无'_execute_on_connection'属性
问题
在Spyder IDE中运行以下代码时出现错误:
from pandasql import sqldf import pandas as pd df = pd.DataFrame({'column1': [1, 2, 3], 'column2': [4, 5, 6]}) query = "SELECT * FROM df WHERE column1 > 1" new_dataframe = sqldf(query) print(new_dataframe)
错误信息:
Traceback (most recent call last): File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\sqlalchemy\engine\base.py:1410 in execute meth = statement._execute_on_connection AttributeError: 'str' object has no attribute '_execute_on_connection' The above exception was the direct cause of the following exception: Traceback (most recent call last): File ~\AppData\Local\Programs\Spyder\pkgs\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\users\yv663dz\downloads\untitled1.py:18 new_dataframe = sqldf(query) File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\pandasql\sqldf.py:156 in sqldf return PandaSQL(db_uri)(query, env) File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\pandasql\sqldf.py:61 in __call__ result = read_sql(query, conn) File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\pandas\io\sql.py:592 in read_sql return pandas_sql.read_query( File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\pandas\io\sql.py:1557 in read_query result = self.execute(*args) File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\pandas\io\sql.py:1402 in execute return self.connectable.execution_options().execute(*args, **kwargs) File ~\AppData\Local\Programs\Spyder\Python\lib\site-packages\sqlalchemy\engine\base.py:1412 in execute raise exc.ObjectNotExecutableError(statement) from err ObjectNotExecutableError: Not an executable object: 'SELECT * FROM df WHERE column1 > 1'
已安装最新版本的pandas、pandasql和sqlalchemy。
解决方法
原因
SQLAlchemy 2.0+版本移除了对直接传入字符串SQL语句给execute方法的支持,而当前pandasql版本未适配该变更,导致报错。
方案1:降级SQLAlchemy到兼容版本
在终端执行以下命令:
pip install sqlalchemy==1.4.49 --force-reinstall
方案2:修改代码适配SQLAlchemy 2.0+
导入SQLAlchemy的text函数包裹查询语句,并显式传递当前环境变量:
from pandasql import sqldf import pandas as pd from sqlalchemy import text df = pd.DataFrame({'column1': [1, 2, 3], 'column2': [4, 5, 6]}) # 用text包裹SQL查询语句 query = text("SELECT * FROM df WHERE column1 > 1") # 显式传入globals()作为环境变量 new_dataframe = sqldf(query, globals()) print(new_dataframe)
内容的提问来源于stack exchange,提问作者ciavam
相关产品推荐
相关产品推荐

