当我们得到了一个数据集,需要更新到数据库,但并不是每条数据都需要更新,只有符合条件的需要更新,这时写一个sql,会怎么写。如果使用普通的update … set 写就需要多条。sql中有case when then的语句
UPDATE `classroom_users`
SET `name` = CASE
WHEN (classroom_users.uid = 189) THEN
'李艳1'
ELSE
NULL
END,
`account` = CASE
WHEN (`classroom_users`.`uid` = 189) THEN
'18611110001'
ELSE
NULL
END,
`gender` = CASE
WHEN (`classroom_users`.`uid` = 189) THEN
0
ELSE
NULL
END
WHERE uid in (189)
更新classroom_users表,符合when的条件时附加then的结果。
django也有这种用法。
from django.db.models import Case, When, Value
User.objects.filter(account__in=(189, )).update(
name=Case(
When(classroom_users.uid=189,
then=Value('李艳1')),
),
account=Case(
When(classroom_users.uid=189,
then=Value('18611110001')),
),
gender=Case(
When(classroom_users.uid=189,
then=Value('0')),
),
)
当有多个项时需要自己构造一下
from django.db.models import Case, When, Value
students = json.loads(students).get('data') # 得到所有学生
upload_uid = [] # 需要更新的uid
names = []
taccounts = []
genders = []
isdeletes = []
s = [] # 需要批量创建的列表
for student in students: 当account=user_id 时更新对应的值,构建多个When对象加到列表里
user_id = student['user_id']
upload_uid.append(user_id)
username = student['username']
full_name = student['full_name']
sex = student['sex']
name = When(account=user_id, then=Value(full_name))
names.append(name)
taccounts.append(When(account=user_id, then=Value(username)))
if sex == None:
sex = 'secret'
genders.append(When(account=user_id, then=Value(sex)))
isdeletes.append(When(account=user_id, then=Value(0)))
names = Case(*names, output_field='user_id') 根据多个when的列表生成对应的Case对象
taccounts = Case(*taccounts, output_field='user_id')
genders = Case(*genders, output_field='user_id')
isdeletes = Case(*isdeletes, output_field='user_id')
User.objects.filter(account__in=upload_uid).update(
name=names,
taccount=taccounts,
gender=genders,
isdeleted=isdeletes
)