s = text('SELECT customers.id,WHERE customers.end_date IS NULL or customers.end_date >= '+ "2018-05-01"+ 'AND customers.end_date <='+"2018-05-31" + 'ORDER BY customers.id;')
这会引发语法错误。我如何在上述声明中传递日期值?如何进入日期字符串?仅使用 sqlalchemy core 版本1.0.8,python 2.7
答案 0 :(得分:2)
有多种潜在的语法错误。第一个是在WHERE子句之前的SELECT项列表末尾的额外逗号。第二个(和第三个)你正在比较的文字周围缺少的引号。缺少的空格也会改变查询的解析方式。字符串连接后,结果如下:
In [2]: s
Out[2]: 'SELECT customers.id,WHERE customers.end_date IS NULL or customers.end_date >= 2018-05-01AND customers.end_date <=2018-05-31ORDER BY customers.id;'
这显然是错误的。
与往常一样,不要将值传递给具有字符串连接或格式的SQL查询,除非它们是静态的,在这种情况下,它们是您查询的一部分。如果这样做,您可能会将自己暴露给SQL injection。你正在使用的驱动程序知道如何处理不同的数据类型,引用等比你更好 - 可能。使用占位符:
s = text('''SELECT customers.id
WHERE customers.end_date IS NULL
OR customers.end_date >= :end_date_low
AND customers.end_date <= :end_date_high
ORDER BY customers.id''')
low = "2018-05-01"
high = "2018-05-31"
# engine, connection, or session
conn.execute(s, end_date_low=low, end_date_high=high)
此外,您可以在此处使用SQL运算符BETWEEN:
s = text('''SELECT customers.id
WHERE customers.end_date IS NULL
OR customers.end_date BETWEEN :end_date_low AND :end_date_high
ORDER BY customers.id''')
答案 1 :(得分:1)
试试这个:
s = text('SELECT customers.id WHERE customers.end_date IS NULL or
customers.end_date >= \'2018-05-01\' AND customers.end_date
<= \'2018-05-31\' ORDER BY customers.id;')
答案 2 :(得分:1)
连接字符串时要小心,可能会遗漏一些空格。例如:
"2018-05-01"+ 'AND customers.end_date <='
=&gt; "2018-05-01AND customers.end_date <='
。
等
另一件事是在里面查询中添加引号。
在你的情况下,引号不是查询的一部分。
所以你可以改为:
"'2018-05-01'"+ ' AND customers.end_date <='
。
或者查看@Dataichou的完整示例