如果我比较日期时间,Django 的 str(queryset.query) returns 无效 SQL
Django's str(queryset.query) returns invalid SQL if I compare datetimes
我有一个用 queryset.filter(date__gte=datetime(2011,1,1))
准备的 Django 查询集
如果我随后调用 str(queryset.query)
我会在字符串中看到:
... WHERE "App_table"."date" >= 2011-1-1
但是,这是无效的 SQL 代码,就好像我 运行 在 Postgresql 中我得到这个错误:
... WHERE "App_table"."date" >= 2011-1-1
ERROR: operator does not exist: date >= integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
为什么会这样,我如何让 Django 输出我可以处理的正确 SQL 代码?
如果我的模型字段是 models.DateField
:
,这就是我过滤日期的方式
queryset.filter(date__gte=datetime.date(2011,1,1))
我想如果您已将字段 date
声明为 DateTimeField
,则比较会起作用。
您可以使用query. sql_with_params()
方法。
print(q.query. sql_with_params())
这将打印查询的参数化版本。
添加到 Danel Roseman 的回答中,我如何获得有效的 SQL 语句是使用这个:
sql, params = unioned_qs.query.sql_with_params()
params_with_quotes = []
for x in params:
params_with_quotes.append("'%s'" % x)
print(sql % tuple(params_with_quotes))
Django SQL 查询无效的原因是缺少引号,通过用带引号的字符串替换所有值,SQL 应该是有效的。适用于我的一个边缘案例,但尚未对这一理论进行足够广泛的测试。
在 Django 3.2 和 Python 3.9
上测试
我有一个用 queryset.filter(date__gte=datetime(2011,1,1))
如果我随后调用 str(queryset.query)
我会在字符串中看到:
... WHERE "App_table"."date" >= 2011-1-1
但是,这是无效的 SQL 代码,就好像我 运行 在 Postgresql 中我得到这个错误:
... WHERE "App_table"."date" >= 2011-1-1
ERROR: operator does not exist: date >= integer
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
为什么会这样,我如何让 Django 输出我可以处理的正确 SQL 代码?
如果我的模型字段是 models.DateField
:
queryset.filter(date__gte=datetime.date(2011,1,1))
我想如果您已将字段 date
声明为 DateTimeField
,则比较会起作用。
您可以使用query. sql_with_params()
方法。
print(q.query. sql_with_params())
这将打印查询的参数化版本。
添加到 Danel Roseman 的回答中,我如何获得有效的 SQL 语句是使用这个:
sql, params = unioned_qs.query.sql_with_params()
params_with_quotes = []
for x in params:
params_with_quotes.append("'%s'" % x)
print(sql % tuple(params_with_quotes))
Django SQL 查询无效的原因是缺少引号,通过用带引号的字符串替换所有值,SQL 应该是有效的。适用于我的一个边缘案例,但尚未对这一理论进行足够广泛的测试。
在 Django 3.2 和 Python 3.9
上测试