Django ORM原始删除查询不删除记录

2023-12-31

我在用raw_sql为了方便我的查询以保持数据库最小化,我正在删除额外的记录。通过这个查询

#d is from a loop and has values
res=MyModel.objects.raw("DELETE FROM mydb_mymodel WHERE mydb_mymodel.s_type = '%s' and mydb_mymodel.barcode = '%s' and mydb_mymodel.shopcode = '%s' and mydb_mymodel.date = '%s'" ,[d.s_type,d.barcode,d.shopcode,d.date])

它不是删除数据库中的记录,而是

当我做res.query并从运行它postgres控制台它有效!

是的,我可以使用

MyModel.objects.filter(s_type=d.s_type,barcode=d.barcode,
shopcode=d.shopcode,date=d.date).delete()

但我缺少什么raw_sql?


A .raw(..) https://docs.djangoproject.com/en/dev/topics/db/sql/#django.db.models.Manager.raw is not它是急切执行的,就像大多数延迟执行的 Django ORM 查询一样。因此它返回一个RawQuerySet对象与对象中的查询。例如:

>>> User.objects.raw('BLA BLA BLA', [])
<RawQuerySet: BLA BLA BLA>

像这样的查询BLA BLA BLA没有任何意义:数据库会出错,但我们仍然检索到RawQuerySet.

您可以通过迭代来强制评估,然后我们得到:

>>> list(User.objects.raw('BLA BLA BLA', []))
Traceback (most recent call last):
  File "/djangotest/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/djangotest/env/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 412, in _query
    rowcount = self._do_query(q)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 375, in _do_query
    db.query(q)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/connections.py", line 276, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BLA BLA BLA' at line 1")

So the list(..)强制评估,现在数据库当然会产生错误。然而,即使它是有效的DELETE查询,它仍然会引发错误,因为这样的查询不会返回任何记录。

为了要做DELETE调用,Django 手册指定你应该使用游标 [Django-doc] https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly:

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute(
        "DELETE FROM mydb_mymodel WHERE s_type = '%s' AND barcode = '%s' AND shopcode = '%s' AND date = '%s'" ,
        [d.s_type,d.barcode,d.shopcode,d.date]
    )

但我认为指定它可能要简单得多:

MyModel.objects.filter(
    s_type=d.s_type,
    barcode=d.barcode,
    shopcode=d.shopcode,
    date=d.date
).delete()

这将构建一个DELETE查询,并正确序列化参数。 A.delete()查询是急切完成的,因此犯上述错误的几率要低得多:如果 ORM 实现正确,那么我们不需要担心这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django ORM原始删除查询不删除记录 的相关文章

随机推荐

  • 如何使用 Talend tREST 上传文件?

    Experts 我需要使用 Talend tREST 组件将文件上传到 Zephyr JIRA 我不知道在 httpbody 部分中给出的格式 语法 例如curl的 F 电子邮件受保护 cdn cgi l email protection
  • 如果从本地数据库提取,LINQ-to-SQL 类不会实现 INotifyPropertyChanging 和 INotifyPropertyChanged

    我在 LINQ to SQL 类中修改了数据源 通过旧的删除和拖回方法 并惊讶地发现 INotifyPropertyChanging 和 INotifyPropertyChanged 接口不再在生成的类 MyDb designer cs 中
  • Minecraft 服务器的世界边界修剪脚本

    我正在尝试创建一个脚本 每天凌晨 5 点修剪 Minecraft 服务器的世界 到目前为止 它运行命令 wb NAME TRIM 其中 NAME 是世界的名称 然后运行命令 wb TRIM CONNECT 以初始化修剪过程 bin bash
  • 我可以在 firestore 中查询嵌套文档值吗?

    我想在 firestore 中搜索以下数据 收藏 gt 文档 gt date month 10 year 2017 var ref db collection collection doc document ref where date m
  • AWS Athena 对于 api 来说太慢了?

    计划是从 aws 数据交换获取数据 将其移动到 s3 存储桶 然后通过 aws athena 查询数据 api 一切正常 只是感觉有点慢 无论数据集还是查询 athena 响应时间都不能低于 2 秒 对于 API 来说 这已经太多了 我检查
  • Jooq批量记录插入

    我目前正在尝试批量插入许多记录 2000 而 Jooq 的batchInsert 没有执行我想要的操作 我将 POJO 转换为 UpdatableRecords 然后执行 batchInsert 它为每条记录执行插入 因此 Jooq 为每个
  • 从“int”到“const char*”的无效转换[重复]

    这个问题在这里已经有答案了 我在用着gcc在代码块上 我想编写一个使用记录数组的函数 但是我不断收到错误 invalid conversion from int to const char 代码 include
  • Pandas:获取去年同一天的值

    我正在寻找一种方法 如何获取前一年同一天的值 F e 我们有 2014 年 1 月 1 日的值 我想创建一个新列 其中包含这一天的值 但来自一年前 表的示例 我想获取 Previos Year 列 Date Ticks Previos Ye
  • 如何在训练期间每个时期结束时调用测试集?我正在使用张量流

    我正在使用 Tensorflow Keras 开发一个 CNN 模型 其中我将数据集分为训练集 验证集和测试集 我需要在每个时期结束时调用测试集以及训练集和验证集来评估模型性能 下面是我跟踪训练集和验证集的代码 result dic epo
  • 如何注入特定的缓存池?

    在我的 Symfony 5 应用程序中 我想针对不同的任务以及不同的环境使用不同的缓存 例如我的配置如下所示 framework cache pools cache auth adapter cache adapter redis prov
  • 将 nginx.conf 添加到 Kubernetes 集群

    我怎样才能通过nginx conf配置文件到 Kubernetes 集群内运行的 nginx 实例 您可以创建一个 ConfigMap 对象 然后将值作为文件安装在您需要的位置 apiVersion v1 kind ConfigMap me
  • 说明:register_shutdown_function [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 什么是register shutdo
  • 我已经被 async/await 宠坏了!现在正在努力解决明确的任务延续问题

    编辑 接受后 它可能不会立即显而易见 但 Servy 的答案是正确的 不需要自定义实现Unwrap在 monodroid 下 在我的评论中我说它不存在 但它确实存在 End edit 我正在编写一堆使用我们的 RESTful Web 服务的
  • Pytesseract - 使用用户模式

    我正在尝试将 tesseract 的用户模式与 pytesseract 一起使用 但似乎无法使该命令正常工作 这看起来应该相当简单 但文档很少 我使用的是 tesseract 3 05 01 这样做是行不通的 pytesseract ima
  • 在 Vim 中更改大小写

    Vim 中是否有命令可以更改所选文本的大小写 Visual select the text http vimdoc sourceforge net htmldoc visual html visual use then U for uppe
  • Python程序遍历目录并读取文件信息

    我刚刚开始使用 Python 但已经发现它比 Bash shell 脚本更加高效 我正在尝试编写一个 Python 脚本 该脚本将遍历从我启动脚本的目录分支的每个目录 并且对于它遇到的每个文件 加载此类的实例 class FileInfo
  • 我在颤振中遇到空安全问题

    我在 Flutter 中遇到空安全问题 我想将数据放入其中水平数据表 https pub dev packages horizontal data table在 Flutter 中 我用StreamBuilder但是当我在小部件内调用它时
  • Boost.Python.ArgumentError:python str 未转换为 std::string

    我收到一个错误 我无法理解尝试通过 Boost Python 包装一个相当简单的 C 类的意义 一 班级 include
  • 使用指令以驼峰命名法设置元素的属性值

    我正在尝试从这样的指令向 angularJs 元素添加属性 element attr startOffset val 但是当我检查该元素时 添加的属性是 startoffset 其中 o 不是大写字母 有什么方法可以向元素添加属性并保持单词
  • Django ORM原始删除查询不删除记录

    我在用raw sql为了方便我的查询以保持数据库最小化 我正在删除额外的记录 通过这个查询 d is from a loop and has values res MyModel objects raw DELETE FROM mydb m