pandas 使用SQLAlchemy和psycopg 2检索DataFrame时出现问题-与create_engine一起使用,但与psycopg 2不一起使用

0mkxixxg  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

我在尝试使用psycopg2代替create_engine执行以下代码片段时遇到了一个问题。

# Code snippet using create_engine (works fine):
from sqlalchemy import create_engine
import pandas as pd

db_url = "your_database_url_here"
engine = create_engine(db_url)

# Establish a connection
connection = engine.connect()

sql_query = "your_table_name"
df = pd.read_sql(sql_query, con=connection)

字符串
如果数据库中存在your_table_name表,则成功返回DataFrame
当我使用psycopg2复制完全相同的代码时,它会抛出一个错误。下面是修改后的代码:

# Code snippet using psycopg2 (throws error):
import psycopg2
import pandas as pd

db_url = "your_database_url_here"
conn = psycopg2.connect(db_url)
cursor = conn.cursor()

sql_query = "your_table_name"

# The following line throws an error
df = pd.read_sql(sql_query, con=conn)


我已经验证了该表存在于数据库中。关于可能导致此问题的原因,有什么想法吗?
在提供的代码片段中,我使用SQLAlchemycreate_engine建立连接,并使用pd.read_sql检索DataFrame。在查询名为your_table_name的表时,这成功地工作了。
但是,当尝试使用psycopg2复制相同的功能时,在执行pd.read_sql期间发生错误:

Execution failed on sql 'transaction': syntax error at or near "your_table_name"
LINE 1: your_table_name
        ^

7gcisfzg

7gcisfzg1#

根据documentation

sqlstr or SQLAlchemy Selectable(select or text object)

要执行的SQL查询或表名。

con:*SQLAlchemy可连接、str或sqlite3连接 *

使用SQLAlchemy可以使用该库支持的任何数据库。如果是DBAPI 2对象,则只支持sqlite3。用户负责引擎处理和SQLAlchemy可连接的连接关闭; str连接会自动关闭。请参阅此处。
因此,如果您不使用SQLAlchemy,即使psycopg2符合DBAPI 2.0规范,也应该只使用sqlite连接,否则您将收到UserWarning

UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.

字符串
然而,这并不是你的代码引发错误的原因。实际上,当使用SQLAlchemy时,你只能传递一个表名,否则你必须传递一个SQL查询。

sql_query = "SELECT * FROM your_table_name"
df = pd.read_sql(sql_query, con=conn)
...
UserWarning: ...


我的建议:要么你使用SQLAlchemy和Pandas,要么你使用connectorx来加载你的数据(只读!):

#! pip install connectorx
import connectorx as cx

db_url = "your_database_url_here"
sql_query = "SELECT * FROM your_table_name"
df = cx.read_sql(db_url, sql_query)

jxct1oxe

jxct1oxe2#

如果你想走这条路:

import pandas as pd
import psycopg2
from psycopg2.extras import RealDictCursor

con = psycopg2.connect("dbname=db_name user=user_name", cursor_factory=RealDictCursor)

cur = con.cursor()
cur.execute("select * from some_table")

df = pd.DataFrame.from_records(cur.fetchall())

con.close()

字符串

相关问题