您可以在 sql_raw 查询中使用 {}(格式)来指定日期吗?

Can you use {} (format) within sql_raw query for assigning a date?

我希望使用变量在 sql 查询中分配日期,而不是手动输入。我在下面尝试了以下但我得到了 IndexError: tuple index out of range

us_ids #list of ids
placeholders_id = ','.join('%s' for i in range(len(us_ids)))  # '?,?'

start = '2000/01/01'
end = '2020/12/31'

需要查询

sql_query = '''
SELECT *
FROM a.b
WHERE date between ({}) and ({})
and relevance >= 90
and id IN ({})'''.format(start, end, placeholders_id)

sql_call = conn.raw_sql(sql_query, params=(us_ids))

当我手动设置日期时,如下所示。

sql_query = '''
SELECT *
FROM a.b
WHERE date between '2000/01/01' and '2020/12/01'
and relevance >= 90
and id IN ({})'''.format(start, end, placeholders_id)

sql_call = conn.raw_sql(sql_query, params=(us_ids))

任何帮助都会很棒!!

Can you use {} (format) within sql_raw query for assigning a date?

请不要这样做。正如您所演示的那样,使用字符串格式将值传递给查询很容易出错,并且可能导致 SQL 注入。使用与处理 IN 值列表时完全相同的方法来传递日期文字:

sql_query = '''
SELECT *
FROM a.b
WHERE date between %s and %s
and relevance >= 90
and id IN ({})'''.format(placeholders_id)

sql_call = conn.raw_sql(sql_query, params=(start, end, *us_ids))