我正在尝试用 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”,则会出现错误。
请帮助我,如何在查询中正确放置变量...
答案 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)