# 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 ^
根据文档:
sql:str 或 SQLAlchemy 可选(选择或文本对象)
要执行的 SQL 查询或表名称。con:SQLAlchemy 可连接、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)