pandas 'pd.read_sql(sql,引擎)'引发未实现错误:SQLAlchemy 2.0未实现此方法

6gpjuf90  于 2023-02-02  发布在  其他
关注(0)|答案(4)|浏览(653)

我尝试使用sqlalchemy引擎直接从我的sqlserver数据库创建一个panda DataFrame:

engine = create_engine(URL_string, echo=False, future=True)
query_string = "..."
dt = pd.read_sql(query_string, engine)

但这产生了这个错误:

File <redacted>/venv/lib/python3.8/site-packages/sqlalchemy/future/engine.py:320, in Engine._not_implemented(self, *arg, **kw)
    319 def _not_implemented(self, *arg, **kw):
--> 320     raise NotImplementedError(
    321         "This method is not implemented for SQLAlchemy 2.0."
    322     )

NotImplementedError: This method is not implemented for SQLAlchemy 2.0.

我这样做是因为单独使用pyodbc的连接会给出一个警告:

UserWarning: pandas only support SQLAlchemy connectable(engine/connection) ordatabase string URI or sqlite3 DBAPI2 connectionother DBAPI2 objects are not tested, please consider using SQLAlchemy
  warnings.warn(

我使用的是sqlalchemy版本1.4 ...那么我该如何解决这个问题呢?

v9tzhpje

v9tzhpje1#

只需从engine参数中删除future=True

engine = create_engine(URL_string, echo=False)

那你应该可以走了!

ygya80vv

ygya80vv2#

这对我使用pyodbc和panda很有效。只要替换查询和连接信息就行了。

import pandas as pd
import warnings

query = 'SELECT * FROM TABLE'
conn = pyodbc.connect('db connection info')

with warnings.catch_warnings():
     warnings.simplefilter('ignore', UserWarning)
     df = pd.read_sql(query, conn)
kognpnkq

kognpnkq3#

不幸的是,这看起来是一个开放的问题,将不会得到解决,直到Pandas2.0,你可以找到一些关于这个here和这里的信息。
我没有找到任何令人满意的工作,但有些人似乎正在使用两种配置的引擎,一个与旗帜未来假:

engine2 = create_engine(URL_string, echo=False, future=False)

如果您像以前那样创建查询字符串,这个解决方案就可以了,但是如果您使用ORM,我能做的最好的事情就是创建一个自定义函数,这可能远不是最佳的,但是可以工作:

Conditions = session.query(ExampleTable)
def custom_read(query):
    return pd.DataFrame([i.__dict__ for i in query]).drop(columns='_sa_instance_state')
df = custom_read(ExampleTable)
nvbavucw

nvbavucw4#

根据文档,访问execute函数最简单的方法是通过engine.connect()上下文管理器,你还需要使用text函数,因为execute函数不再接受原始字符串。
这就是我的工作:

from sqlalchemy import text

with engine.connect() as connection:
    dt= pd.read_sql_query(text(query_string), conn)

https://docs.sqlalchemy.org/en/20/core/connections.html#basic-usage

相关问题