使用 SQLAlchemy 和 psycopg2 检索 DataFrame 时出现问题 - 适用于 create_engine,但不适用于 psycopg2

问题描述 投票:0回答:1
# I'm facing an issue when trying to execute the following code snippet using psycopg2 in place of 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)

# This successfully returns a DataFrame if the 'your_table_name' table is present in the database.

# When I replicate the exact same code using psycopg2, it throws an error. Here's the modified code:

# 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)

# I've verified that the table exists in the database. Any ideas on what might be causing this issue?

在提供的代码片段中,我使用 SQLAlchemy 和

create_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 ^

python pandas postgresql psycopg2
1个回答
0
投票

根据文档

sqlstr 或 SQLAlchemy 可选(选择或文本对象)
要执行的 SQL 查询或表名称。

conSQLAlchemy 可连接、str 或 sqlite3 连接
使用 SQLAlchemy 可以使用该库支持的任何数据库。如果是 DBAPI2 对象,则仅支持 sqlite3。用户负责 SQLAlchemy 可连接的引擎处理和连接关闭; str 连接会自动关闭。看这里。

因此,如果您不使用

SQLAlchemy
,即使
sqlite
符合 DBAPI 2.0 规范,您也应该只使用
psycopg2
连接,否则您将收到
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)
© www.soinside.com 2019 - 2024. All rights reserved.