【问题标题】:PostgeSQL query in Python : how to pass dynamic parameter?Python 中的 PostgreSQL 查询:如何传递动态参数?
【发布时间】:2021-03-10 23:09:56
【问题描述】:

我正在尝试在 Python 中创建动态 PostgreSQL 查询:

import psycopg2
import pandas as pd

V_ID=111

conn = psycopg2.connect(host="xxxx", port = 5432, database="xxxx", user="xxxxx", password="xxx")

df= pd.read_sql_query 
("""SELECT u.user_name, sum(s.sales_amount)
FROM public.users u left join public.sales s on u.id=s.user_id
WHERE USER_ID = v_ID
Group by u.user_name""",con=conn)
df.head()

当我设置固定 ID 时,查询运行良好,但如果我设置变量“V_ID”,则会出错。

请帮助我,如何在查询中正确放置变量...

【问题讨论】:

    标签: python sql pandas postgresql


    【解决方案1】:

    您可以使用字符串格式来传递查询字符串中的值。您可以在此处阅读有关字符串格式的更多信息:https://www.w3schools.com/python/ref_string_format.asp

    v_ID = "v_id that you want to pass"
    
    query = """SELECT u.user_name, sum(s.sales_amount)
    FROM public.users u left join public.sales s on u.id=s.user_id
    WHERE USER_ID = {v_ID}
    Group by u.user_name""".format(v_ID=v_ID)
    
    df= pd.read_sql_query(query ,con=conn)
    

    正如@Adrian 在 cmets 中提到的,字符串格式化不是正确的方法

    更多详情:https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

    根据docs,参数可以是列表、元组或字典。

    用于传递参数的语法取决于数据库驱动程序。查看 您的数据库驱动程序文档为五种语法中的哪一种 支持 PEP 249 的 paramstyle 中描述的样式。例如。为了 psycopg2,使用 %(name)s 所以使用 params={‘name’ : ‘value’}。

    在 psycopg2 的情况下,您可以这样做。

    v_ID = "v_id that you want to pass"
    
    query = """SELECT u.user_name, sum(s.sales_amount)
    FROM public.users u left join public.sales s on u.id=s.user_id
    WHERE USER_ID = %(v_ID)s
    Group by u.user_name"""
    
    df= pd.read_sql_query(query ,con=conn, params={"v_ID":v_ID})
    

    【讨论】:

    • 感谢您的回答,我有点困惑我在哪里放一个数字?最初是 v_ID ="111" 或格式: .format(v_ID=111) ??
    • 你只需要写在第一行,比如 v_ID="111",如果有帮助,请考虑支持我的答案。
    • 不应使用此方法的原因:Parameters。而是使用read_sql_queryparams 参数来传递值。
    • @AdrianKlaver 感谢您提及这一点,我已经编辑了我的答案。如果您认为现在可以帮助其他人,您可以再次投票。
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多