首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将不可执行的SQL对象传递给熊猫read_sql()方法

将不可执行的SQL对象传递给熊猫read_sql()方法
EN

Stack Overflow用户
提问于 2022-09-04 16:49:54
回答 1查看 62关注 0票数 0

在Python3.9代码中,我面临着这个新的警告:

代码语言:javascript
运行
复制
/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

在这样的片段上:

代码语言:javascript
运行
复制
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。

但通过这样做:

代码语言:javascript
运行
复制
from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg2://', creator=connector)

df = pd.read_sql(
    sql=query,
    con=engine
)

上面写着:

代码语言:javascript
运行
复制
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;')])

因此,我必须这样调整它,以避免这个错误:

代码语言:javascript
运行
复制
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)‘

EN

回答 1

Stack Overflow用户

发布于 2022-09-04 17:13:09

查询可以用如下所示的SQLAlchemy语法表示:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73601191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档