Django中使用RAW SQL进行多次更新



我在Django中遇到了一种情况,我需要使用RAW SQL更新数据库中的多行,因为它是在另一个系统上创建的表,不由ORM管理。

由于有多行要更新,是否可以运行一个命令来同时更新所有内容,而不必在for循环中包含游标.execute(SQL,params(

目前,我只能通过将每个更新行包含在for循环中来正确地进行更新,但我认为这不是一个好的做法。它的工作原理是这样的:

person_list=[[john,33,50],[mary,20,41],[peter,12,93]]
with connection.cursor() as cursor:
for item in person_list:
SQL="UPDATE PERSON SET NAME = %s, AGE = %s WHERE PERSON_ID = %s"
params.extend([item[0], item[1], item[2]])
cursor.execute(SQL,params)

我希望Django运行一个SQL命令,如下所示:

SQL+="""
update person name='john', age='33' where person_id=50;
update person name='mary', age='20' where person_id=41;
update person name='John', age='12' where person_id=93;
"""
cursor.execute(SQL)

我试着做了如下的事情,但没有成功,错误信息是";ORA-00933:SQL命令未正确结束":

for item in person_list:
SQL+="UPDATE PERSON SET NAME = %s, AGE = %s WHERE PERSON_ID = %s; "
params.extend([item[0], item[1], item[2]])
with connection.cursor() as cursor:
cursor.execute(SQL,params)

我不知道我是否对此过于担心,以及这是否真的会影响系统的性能。我担心的正是因为我一直从每个人那里听说,永远不应该在循环中包含SQL命令。

数据库是Oracle。

谢谢

如果您有Person模型,您可以使用Django ORM进行批量更新。因此,如果模型看起来像:

class Person(models.Model):
person_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
age = models.IntegerField()

然后您可以使用.bulk_update(…)[Django-doc]:批量更新

person_list=[['john', 33, 50], ['mary', 20, 41], ['peter', 12, 93]]
Person.objects.bulk_update(
[Person(person_id=person_id, name=name, age=age) for name, age, person_id in person_list]
fields=['name', 'age']
)

使用Django ORM更方便,不太可能出错,如果你用正确的方言正确地定义了数据库的settings.py对话,它就会出错。

最新更新