在Python3.9代码中,我面临着这个新的警告:
/usr/local/lib/python3.9/site-packages/pandas/io/sql.py:761:
UserWarning:
pandas only support SQLAlchemy connectable(engine/connection) or
database string URI or sqlite3 DBAPI2 connectionother DBAPI2
objects are not tested, please consider using SQLAlchemy
在这样的片段上:
import pandas as pd
from psycopg2 import sql
fields = ('object', 'category', 'number', 'mode')
query = sql.SQL("SELECT {} FROM categories;").format(
sql.SQL(', ').join(map(sql.Identifier, fields))
)
df = pd.read_sql(
sql=query,
con=connector() # custom function which returns db parameters as a psycopg2 connection object
)
目前,它的功能就像一种魅力,但是根据警告信息,我想切换到SQLAlchemy。
但通过这样做:
from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://', creator=connector)
df = pd.read_sql(
sql=query,
con=engine
)
上面写着:
sqlalchemy.exc.ObjectNotExecutableError: Not an executable object:
Composed([SQL('SELECT '), Composed([Identifier('object'), SQL(', '),
Identifier('category'), SQL(', '), Identifier('number'), SQL(', '),
Identifier('mode')]), SQL(' FROM categories;')])
因此,我必须这样调整它,以避免这个错误:
engine = create_engine('postgresql+psycopg2://', creator=connector)
conn = connector()
curs = conn.cursor()
df = pd.read_sql(
sql=query.as_string(conn), # non-pythonic, isn't it?
con=engine
)
我在想,如果我必须使用SQLAlchemy连接上下文来“解码”查询字符串,那么在熊猫中使用psycpg2引擎有什么好处呢?(在查询字符串是二进制字符串的某些特定情况下,我必须通过应用.decode('UTF-8')
.来“解码”它)
我怎样才能用正确的(也就是最好的)方式重写DataFrame结构,用SQLAlchemy引擎处理熊猫呢?
熊猫文档对我来说并不是百分之百清楚:
参数 sqlstr或SQLAlchemy Selectable (选择或文本对象)、要执行的SQL查询或表名。
版本信息:
python: 3.9
熊猫:'1.4.3‘
炼金术:“1.4.35”
psycopg2:'2.9.3 (dt dec pq3 ext lo64)‘
发布于 2022-09-04 17:13:09
查询可以用如下所示的SQLAlchemy语法表示:
import pandas as pd
import sqlalchemy as sa
fields = ('object', 'category', 'number', 'mode')
# Adjust engine configuration to match your environment.
engine = sa.create_engine('postgresql+psycopg2:///test')
metadata = sa.MetaData()
# Reflect the table from the database.
tbl = sa.Table('categories', metadata, autoload_with=engine)
# Get column objects for column names.
columns = [tbl.c[name] for name in fields]
query = sa.select(*columns)
df = pd.read_sql(sql=query, con=engine)
print(df)
https://stackoverflow.com/questions/73601191
复制相似问题