본문 바로가기
백엔드기술/개발언어

Django 에서 복합키 업데이트시 주의사항

by RevFactory 2014. 3. 12.

기존에 사용중인 테이블이 복합키로 구성되어있어서 아래와 같이 모델을 정의하고,


class Task(models.Model):

    batchtaskid = models.CharField(primary_key=True, max_length=20, blank=True)

    userid = models.CharField(primary_key=True, max_length=6, blank=True)

    status = models.CharField(max_length=1, blank=True)

    class Meta:

        db_table = 'task'


업데이트를 하도록 코드를 작성했습니다.

if form.is_valid():

form.cleaned_data['batchtaskid']

            userid = form.cleaned_data['userid']

            status = form.cleaned_data['status']

            task = Task.objects.get(userid=userid, batchtaskid = taskid)

            task.status = status

            task.save()


그 결과 재앙이 일어납니다...

save()를 하는 시점에서 생성되는 쿼리가 아래와 같이 되기 때문입니다.

QUERY = u'UPDATE "task" SET "status" = %s WHERE "task"."userid" = %s '


WHERE 조건에 batchtaskid 와 userid가 AND 조건으로  UPDATE가 실행되는 것을 예상했는데

userid만 들어갔으므로 입력된 userid에 해당되는 모든 레코드의 status가 변경이 되어버립니다.


Django 홈페이지에서 확인해보니 Django에서 복합키를 지원하지 않는다고 합니다.

(https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys)



따라서 위의 경우 업데이트 로직을 아래와 같이 바꿔서 작성해야 합니다.

if form.is_valid():

            taskid = form.cleaned_data['batchtaskid']

            userid = form.cleaned_data['userid']

            status = form.cleaned_data['status']

            Task.objects.filter(userid=userid, batchtaskid = taskid).update(status=status)


이렇게 구성해야 예상대로 쿼리가 작성되어집니다.

QUERY = u'UPDATE "task" SET "status" = %s WHERE ("task"."batchtaskid" = %s  AND "task"."userid" = %s )'



'백엔드기술 > 개발언어' 카테고리의 다른 글

Java 버젼별 비교 정리  (0) 2015.03.30
Django decorators 정의해서 사용하기  (0) 2014.03.06
파이썬 imageField  (0) 2014.02.27