Python 中的 PostgeSQL 查询:如何传递动态参数?

时间:2021-03-10 23:09:56

标签: python sql pandas postgresql

我正在尝试用 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”,则会出现错误。

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

1 个答案:

答案 0 :(得分:3)

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

y

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

此处有更多详细信息: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}
Group by u.user_name""".format(v_ID=v_ID)

df= pd.read_sql_query(query ,con=conn)