我使用 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 中缺少了什么呢?
2条答案
按热度按时间uqzxnwby1#
一个**
.raw(..)
**不是 * 急切执行的,它是,就像大多数Django ORM查询是懒惰执行的一样。因此它返回一个RawQuerySet
对象,对象中包含查询。例如:像
BLA BLA BLA
这样的查询没有任何意义:一个数据库将在其上出错,但我们仍然检索到一个RawQuerySet
。你可以强制求值,比如说迭代它,然后我们得到:
所以
list(..)
强制求值,现在数据库当然会产生一个错误,但是即使它是一个有效的 *DELETE
* 查询,它仍然会产生一个错误,因为这样的查询不返回任何记录。为了进行
DELETE
调用,Django手册规定你应该使用光标[Django-doc]:但我认为,将其指定为如下形式可能要简单得多:
这将构造一个
DELETE
查询,并正确地序列化参数。.delete()
查询是急切地完成的,所以犯上面讨论的错误的几率要低得多:如果ORM被正确地实现,那么我们就不需要担心这个问题。uqdfh47h2#
试试这个:
像这样使用它: