You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandasql查询DataFrame时遭遇ObjectNotExecutableError求助

问题

在Ubuntu 20.04.5 LTS系统的Jupyter Notebook(Python3.8环境)中,使用pandasql对pandas DataFrame执行SQL查询时,出现ObjectNotExecutableError,提示查询语句不是可执行对象。已尝试重装、升级pandasql、pandas、pip等相关库,但问题仍未解决。

代码示例:

import pandas as pd
import pandasql as ps
import numpy as np


df = pd.DataFrame([[1234, 'Customer A', '123 Street', np.nan],
               [1234, 'Customer A', np.nan, '333 Street'],
               [1233, 'Customer B', '444 Street', '333 Street'],
              [1233, 'Customer B', '444 Street', '666 Street']], columns=
['ID', 'Customer', 'Billing Address', 'Shipping Address'])

q1 = """SELECT * FROM df """

ps.sqldf(q1)

报错信息:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/.local/lib/python3.8/site-packages/sqlalchemy/engine/base.py in execute(self, statement, parameters, execution_options)
   1409         try:
-> 1410             meth = statement._execute_on_connection
   1411         except AttributeError as err:

AttributeError: 'str' object has no attribute '_execute_on_connection'

The above exception was the direct cause of the following exception:

ObjectNotExecutableError                  Traceback (most recent call last)
<ipython-input-21-8b921e84766f> in <module>
     13 q1 = """SELECT * FROM df """
     14 
---> 15 ps.sqldf(q1)

~/.local/lib/python3.8/site-packages/pandasql/sqldf.py in sqldf(query, env, db_uri)
    154     >>> sqldf("select avg(x) from df;", locals())
    155     """
--> 156     return PandaSQL(db_uri)(query, env)

~/.local/lib/python3.8/site-packages/pandasql/sqldf.py in __call__(self, query, env)
     59 
     60             try:
--> 61                 result = read_sql(query, conn)
     62             except DatabaseError as ex:
     63                 raise PandaSQLException(ex)

~/.local/lib/python3.8/site-packages/pandas/io/sql.py in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
    588         )
    589     else:
--> 590         return pandas_sql.read_query(
    591             sql,
    592             index_col=index_col,

~/.local/lib/python3.8/site-packages/pandas/io/sql.py in read_query(self, sql, index_col, coerce_float, parse_dates, params, chunksize, dtype)
   1558         args = _convert_params(sql, params)
   1559 
--> 1560         result = self.execute(*args)
   1561         columns = result.keys()
   1562 

~/.local/lib/python3.8/site-packages/pandas/io/sql.py in execute(self, *args, **kwargs)
   1403     def execute(self, *args, **kwargs):
   1404         """Simple passthrough to SQLAlchemy connectable"""
--> 1405         return self.connectable.execution_options().execute(*args, **kwargs)
   1406 
   1407     def read_table(

~/.local/lib/python3.8/site-packages/sqlalchemy/engine/base.py in execute(self, statement, parameters, execution_options)
   1410             meth = statement._execute_on_connection
   1411         except AttributeError as err:
--> 1412             raise exc.ObjectNotExecutableError(statement) from err
   1413         else:
   1414             return meth(

ObjectNotExecutableError: Not an executable object: 'SELECT * FROM df '
解决方案

方法1:降级SQLAlchemy到1.x兼容版本

执行以下命令安装适配的旧版本:

pip install sqlalchemy==1.4.49

(可选择1.4.x系列任意稳定版本)

方法2:修改pandasql源码适配SQLAlchemy 2.0+

找到pandasql安装目录下的sqldf.py文件(示例路径:~/.local/lib/python3.8/site-packages/pandasql/sqldf.py),修改第61行的代码:
原代码:

result = read_sql(query, conn)

修改为:

from sqlalchemy import text
result = read_sql(text(query), conn)

保存文件后重启Jupyter Notebook即可生效。

方法3:使用替代库

若不想修改源码或降级,可改用兼容SQLAlchemy新版本的替代库,比如duckdb,用法示例:

import duckdb
duckdb.query("SELECT * FROM df").df()

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:30:53