pandasql.sqldf(); ObjectNotExecutableError:不是可执行对象:'SELECT * FROM df'

ami*_*min 3 sql python-3.x pandas pandasql

我需要 pandasql 库来对我的 pandas 数据框进行一些查询。我在一个简单的示例上运行以下代码并收到以下错误。奇怪的是,不能将其视为查询!我尝试重新安装并升级 pandasql、pandas、pip 和其他一些,但我找不到问题所在。我使用的是 Jupiter Notebook,编译器是 Ubuntu 20.04.5 LTS 上的 python3.8。

代码:

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)

Run Code Online (Sandbox Code Playgroud)

结果:

---------------------------------------------------------------------------
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 '

Run Code Online (Sandbox Code Playgroud)

小智 8

这可能是因为sqlalchemy 2.0中的重大更改。SQL 查询现在必须包装在sqlalchemy.text()函数中才能使其可执行。

了解您当前的 sqlalchemy 版本将有助于了解这是否是您面临的问题。

  • 对我来说,所需的更改是从 `pd.read_sql(query, con=db.connection)` 到 `pd.read_sql(text(query), con=db.connection)` (带有 from sqlalchemy import text) (2认同)

Min*_*ewa 8

SQLAlchemy降级到版本 1.4.46后我能够让它工作,

pip install sqlalchemy==1.4.46
Run Code Online (Sandbox Code Playgroud)