繁体   English   中英

Django 从查询集中获取查询。 返回无效参数

[英]Django get query from queryset. Returning invalid params

当我尝试从 django 查询集中获取查询时,它返回不带引号的参数,这使得它成为一个无效的查询运行

我有一个 django 代码如下:

qs = Sample.objects.filter(data_date__range=[start_date, end_date])

当我尝试获取查询以便我可以使用 pyodbc 查询它时(我发现 django 的查询需要 5 秒,而 pyodbc 对于 50k+ 行需要 <1 秒),我尝试这样获取查询:

str(qs.query)

但是,对于它不带引号返回的参数,例如返回的查询是

SELECT * FROM [sample] WHERE [data_date] 
BETWEEN 2019-01-01 00:00:00 AND 2022-01-01 00:00:00

很明显,2 个日期时间变量中缺少引号,因此当我尝试使用pd.read_sql_query(query, conn)运行查询时,出现指向这些参数的错误。 这不仅仅是日期参数,如果我尝试使用其他任何东西进行过滤,我也会遇到同样的问题。

不带引号查询时出错

Execution failed on sql 'SELECT * FROM [sample] WHERE [sample].[data_date] BETWEEN 2019-01-01 00:00:00 AND 2022-01-01 00:00:00': ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '00'. (102) (SQLExecDirectW)")

我想知道是否有任何其他方法可以从 django 查询集生成查询,以便我可以使用 pyodbc 或其他任何方式运行它以获得更快的结果。

我正在使用Django 3.2sql-server

更新:

数据库上的索引

...
[sample_data_date] (Non-unique, Non-clustered)
AK (Unique, Non-clustered)
PK (clustered)
...

经过大量挖掘,我找到了自己问题的答案。
在这里发帖,这样其他人就不必像我那样搜索了。

结果是queryset.query没有返回有效的 SQL。我们需要使用.sql_with_params()来分别获取查询和参数。

最终代码看起来像这样:

qs = Sample.objects.filter(data_date__range=[start_date, end_date])
query, params = qs.query.sql_with_params()

# pyodbc uses "?" vs django returns "%s" as placeholder
query = query.replace("%s", "?")

df = pd.read_sql(query, pyodbc_conn, params=params)

像这样使用 pyodbc 查询花费了 <1 秒,而使用 Django ORM 查询 56000 行 x 5 列花费了 5 秒。

这张Django 票的帮助很大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM