python - Django:如何获取原始 SQL“COUNT(*)”查询的结果?
问题描述
我有一个如下所示的关键字表:
CREATE TABLE `keywords` (
`keyword` VarChar( 48 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`id` Int( 11 ) AUTO_INCREMENT NOT NULL,
`blog_posts_fulltext_count` Int( 11 ) NOT NULL,
PRIMARY KEY ( `id` ) )
我还有一个如下所示的博客文章表:
CREATE TABLE `blog_posts` (
`id` Int( 11 ) AUTO_INCREMENT NOT NULL,
`title` LongText CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
`summary` LongText CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
PRIMARY KEY ( `id` ) );
CREATE FULLTEXT INDEX `title_summary_fulltext` ON `blog_posts`( `title`, `summary` );
如您所见,我在字段中有一个全文索引title
,summary
在blog_posts
.
以下搜索正常工作:
select count(*) from blog_posts where match(title,summary) against ('paid');
现在我想用出现keywords.blog_posts_fulltext_count
的行数填充blog_posts
该字段keyword
。
当我运行这个:
keywords = Keywords.objects.all()
for the_keyword in keywords:
query = "select count(id) from BlogPosts where match(title,summary) against ('{0}')".format(the_keyword.keyword)
number_of_mentions = blog_posts.objects.raw(query)
for obj in number_of_mentions:
a = obj
... RawQuerySetnumber_of_mentions
似乎返回没有错误,并number_of_mentions.query
包含:
'select count(id) from blog_posts where match(title,summary) against ('paid')'
但是当代码运行该for obj in number_of_mentions
行时,它会抛出:
raise InvalidQuery('原始查询必须包含主键')
我还尝试将查询字符串定义为:
query = "select count('id') from BlogPosts where match(title,summary) against ('{0}')".format(the_keyword.keyword)
...并作为:
query = "select count(*) from BlogPosts where match(title,summary) against ('{0}')".format(the_keyword.keyword)
...产生相同的错误消息。
COUNT
从Django 中的原始 sql 命令获取结果的正确方法是什么?
解决方案
当您使用 时blog_posts.objects.raw()
,Django 期望原始查询以某种方式返回blog_posts
对象。但是您的计数查询将返回单个数字而不是对象集合。这就是您在此处看到的 API 。
如果你想运行一个不会返回模型对象但不同的东西(比如一个数字)的查询,你必须使用同一页面的另一部分中描述的方法——直接执行自定义 SQL。
一般的想法是您必须使用游标(迭代数据库结果集的东西)并获得它的唯一结果。以下示例应该让您了解如何执行此操作。
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("select count(id) from BlogPosts where match(title,summary) against (%s)", [the_keyword.keyword])
# get a single line from the result
row = cursor.fetchone()
# get the value in the first column of the result (the only column)
count_value = row[0]
推荐阅读
- javascript - 与 Promise.all 并行加载和处理文件
- python - EventGrid 触发的 Python Azure 函数“ClientOtherError”和“AuthorizationError”,如何排查?
- spring-boot - @Embeddable Composite Key 不会在 Spring Data JPA 中引发完整性异常
- javascript - 使用 openweathermap api 时无法访问某些对象属性
- selenium - InvalidSelectorException 和 NoSuchElementException 和定位项之间的区别
- android - 在 recyclerview 适配器中自动播放音乐和视频
- r - 子集数据框中的特定行,但保留观察结果
- python - 在 docker 容器内接收多播
- angular - Angular 10延迟加载不会重定向到组件
- java - Kotlin AES BAD_DECRYPT