【发布时间】:2019-02-18 01:53:17
【问题描述】:
我正在尝试构建一个需要两个参数(2列)过滤的SQL,并且第二列需要匹配多个值。
下面是我迄今为止构建的 SQL(感谢 Martijn Pieters 的帮助)
import psycopg2
import pandas as pd
import datetime
# Connecting to db
con = psycopg2.connect(db_details)
cur = con.cursor()
cur.execute("select * from sales limit 10")
rows = cur.fetchall()
params = {'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
'store_name': 'store_1', 'store_2'}
df = pd.read_sql("""
select store_name,count(*) from sales
where created_at >= %(earliest)s
and store_name = %(store_name)s""",
params=params, con=con)
上面的 SQL 有一个用于 where 子句的日期参数,我又添加了一个参数,即 store_name,其中行匹配两个值之一。
想知道如何将这个附加参数添加到现有查询中。
我尝试创建一个参数(类似于日期过滤器)并将其传递给现有查询,但是当我给它两个值时出现语法错误:
'store_name': 'store_1', 'store_2'}
^
SyntaxError: invalid syntax
指向params 字段。
【问题讨论】:
-
您有一个简单的语法错误,因为您确实需要至少更好地学习该语言的基础知识。当您第一次需要正确行走时,您正在尝试跑步。如果你也学习了更多关于 SQL 的基础知识,那也会很有帮助;您不能只为单个参数传入两个值,因为 SQL 将使用不同类型的运算符来测试这些值,而不是
store_name = ...来测试单个值,您必须使用store_name in (<value1>, <value2>, ..., <valueN>)。我希望你的问题真的只关注后一个问题。 -
将来,您确实需要开始包含错误输出的问题,因为尝试定义
store_name至少有人试图回答您的问题会看到这是一个columnname IN (value, value, value)测试,而不是一个直接的单值columnname = value测试。带有参数的 SQLIN测试需要 Python 程序员额外的工作,因为现在您必须为这些参数生成 SQL 文本。 -
如果你只是设置了
'store_name': 'store_1'(所以是一个单一的字符串值),代码会照原样工作。所以这里真正的问题不是定义参数,而是定义多个值的参数。 -
几乎是Python/psycopg2 WHERE IN statement的骗子,至少就整个练习的目标而言。
标签: python sql python-3.x postgresql