当前位置: 首页 > 面试题库 >

Django原始SQL查询-遍历结果,它为每次迭代执行一个查询

通典
2023-03-14
问题内容

在注意到Django的某些内置查询效率低下之后,一直在编写一些原始SQL查询。我试图遍历QuerySet结果并将其分组(我知道regroup模板标签,这对我不起作用-
我需要能够独立访问单独的组)。这是我的代码:

m = Media.objects.raw('SELECT * FROM table') # query simplified for sake of example

media_items = {'aim-icons' : [], 'banners' : [], 'hi-res-photos' : [], 'photos' : [], 'print-ads' : [], 'videos' : [], 'wallpapers' : [] }

for item in m:
    media_items[item.type_slug].append(item)

这给了我我想要的东西(例如,我可以访问的列表media_items['wallpapers']),但是它为每次迭代运行一个数据库查询以获取type_slug字段。我尝试m = list(m)在循环之前添加,没有效果。

有人可以帮我从这里出去吗?这似乎应该很简单。

谢谢,马特


问题答案:

编辑:

这里的问题归结为Djangoraw()方法的工作方式。它返回模型实例(具有您正在访问的属性,从而导致额外的查询)。

这里的适当工具connection.cursor()cursor.execute()cursor.fetchall()。这是文档中的示例

def my_custom_sql():
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data modifying operation - commit required
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
    transaction.commit_unless_managed()

    # Data retrieval operation - no commit required
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row

http://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-
direct



 类似资料:
  • 我正在开发一个带有Spring框架和MySQL数据库的J2EE应用程序。我想执行SQL脚本从java(可能与一个请求映射)只有一次。我将sql语句作为键值对存储在属性文件中,并循环遍历每个键并执行语句。 这是正确的做法吗?或者还有其他方法可以做到这一点吗?提前谢谢。 更新: 正如评论中提到的,我尝试了Spring jdbc intiize数据库,但它没有执行sql文件中的所有查询。只有第一个“创建

  • 问题内容: 我有一张基本上看起来像这样的表: 其中redirectid是另一行的ID。基本上,如果选择了一行,并且该行具有一个redirectid,则应该在该位置使用redirectid数据。可能有多个重定向,直到redirectid为NULL为止。本质上,这些重定向在表中形成一个链接列表。我想知道的是,给定一个ID,是否可以设置一个将遍历所有可能的重定向并在“列表”末尾返回ID的sql查询? 这

  • 问题内容: 有没有一种方法可以显示执行查询时Django正在运行的SQL? 问题答案: 请参阅文档FAQ:“如何查看Django正在运行的原始SQL查询? ” 包含SQL查询的列表: 查询集还具有包含要执行的查询的属性: 请注意,查询的输出不是有效的SQL,因为: “ Django实际上从未插值参数:它将查询和参数分别发送到数据库适配器,后者执行适当的操作。” 来自Django错误报告#17741

  • 在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r

  • 问题内容: 我有一个数据库,每天在其中创建一个表来记录流程实例。这些表标记为MESSAGE_LOG_YYYYMMDD 目前,我想针对所有这些表顺序执行相同的QUERY。我在下面编写了PL / SQL,但陷入了第10行。如何针对此处的所有表成功执行SQL语句? 问题答案: http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/a

  • 问题内容: 我有2列的表格。UTCTime和值。UTCTime以15分钟为增量。我想要一个查询,该查询将在一个小时的跨度内将值与先前的值进行比较,并显示0到4之间的值,具体取决于这些值是否恒定。换句话说,每15分钟增加一个条目,并且该值可以是恒定的,因此我只需要每小时检查一次每个值是否与前一个值相同。 例如 在这种情况下,我只想要一个将12:45的值与12:30以及12:30到12:15进行比较的