【问题标题】:Applying where condition when using pandas read_sql_table() -SQLAlchemy使用 pandas read_sql_table() -SQLAlchemy 时应用 where 条件
【发布时间】:2021-08-30 12:38:36
【问题描述】:

我想使用 SQLAlchemy 和 Pandas 使用 read_sql_table() 将 Posgresql 数据库中的表读入 Pandas 数据帧。对数据库的 SQL 查询类似于:

SELECT col1,col2 FROM my_table WHERE col1=='value'

我尝试使用此代码从表中获取 Pandas 数据框:

from sqlalchemy import create_engine
db_uri = environ.get('SQLALCHEMY_DATABASE_URI')
engine = create_engine(db_uri, echo=True)

table_df = pd.read_sql_table(
'my_table',
con=engine,
schema="public"
columns=['col1','col2'])

此代码有效,但我如何应用条件,类似于 SQL 查询中的 WHERE,并根据该条件过滤数据框? 我不想先在内存中加载数据帧,我想在查询数据库时这样做。

【问题讨论】:

  • 使用 read_sql_query() 并将包含 WHERE 子句的 SELECT 语句传递给它。
  • @GordThompson 谢谢!我最终使用了 read_sql_query。但是我仍然对避免编写任何 SQL 代码的方法感兴趣。
  • 您的意思是使用 SQLAlchemy 的 SQL 表达式语言创建查询,例如 qry = team.select().where(team.c.id == 1),然后将其传递给 pd.read_sql_query(qry, engine)?是的,你可以这样做。

标签: python sql pandas sqlalchemy


【解决方案1】:

正如对该问题的评论中所述,您可以使用read_sql_query() 过滤您的结果。如果您想避免将原始 SQL 语句传递给函数,您可以使用 SQLAlchemy Core 创建查询并将其传递:

import sqlalchemy as sa

# …

team = sa.Table("team", sa.MetaData(), autoload_with=engine)
qry = sa.select(team.c.city, team.c.name).where(team.c.id == 1)
df = pd.read_sql_query(qry, engine)
print(df)
"""
      city    name
0  Calgary  Flames
"""

【讨论】:

    【解决方案2】:
    import pandas as pd
    import sqlalchemy as sa
    engine = sa.create_engine('oracle+cx_oracle://user:senha@db', echo=False)
    
    team = sa.Table('oracle_table', sa.MetaData(), autoload_with=engine, schema='db')
    qry = sa.select(team.c.column_a, team.c.column_b).where(
                    team.c.column_b == 'OPTION')
    df = pd.read_sql_query(qry, engine)
    print(df)
    
    engine.dispose()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2019-07-16
      • 2017-05-06
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多