如何使用Sqlalchemy核心与文本sql的日期范围?

时间:2018-06-04 09:04:54

标签: python sqlalchemy

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

3 个答案:

答案 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的完整示例