我可以使用Pandas read_sql函数参数化表吗?

hsvhsicv  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(81)

我得到了一个包含多个项目的数据库,其结构类似于以下内容:

  • 我们的客户Bob的模式:bob_法律的、bob_docs、bob_misc
  • 我们的客户Jess的模式:jess_法律的、jess_docs、jess_misc

我目前使用f-strings来构建查询:

query = f"SELECT * FROM {client}_legal.my_table WHERE country = '{country_name}';"
result = pd.read_sql(query, con)

但我想参数化构建查询。我尝试在panda的read_sql函数中使用params参数。但它不工作,因为它输出如下表:

SELECT * FROM 'bob'_legal.my_table WHERE country = 'canada';"

bob现在用单引号括起来,它会创建一个SQL语法错误。是否有其他方法来完成这项工作,但仍然使用read_sql功能?似乎没有参数化表的选项。

acruukt9

acruukt91#

我假设您使用的是PostgreSQL或任何支持模式的数据库。
使用client = "bob",您的代码对我来说工作得很好。或者(受到 *@amn34的 * answer的启发),您可以尝试使用Identifiers

from sqlalchemy import create_engine
from psycopg2.sql import Identifier, SQL
import pandas as pd

d1 = {
    "user": "xxx", "pass": "xxx",
    "host": "xxx", "port": "xxx", "db": "xxx"
}

# SELECT * FROM 'bob'_legal.my_table WHERE country = 'canada';"
countr_name = "canada"

d2 = {
    "schema_name": Identifier("bob_legal"),
    "table_name": Identifier("my_table"),
    "field_name": Identifier("country"),
}

engine = create_engine("postgresql://{user}:{pass}@{host}:{port}/{db}".format(**d1))
query = SQL("SELECT * FROM {schema_name}.{table_name} WHERE {field_name} = %s").format(**d2)

df = pd.read_sql_query(
    query.as_string(engine.raw_connection().cursor()),
    engine, params=(country_name, )
)

相关问题