django - mariaDB 모델 수정 시 에러발생

파오리·2021년 2월 23일
0

아주 작은 에러

목록 보기
2/5

문제 상황: django와 mariaDB를 연결하여 문제 없이 서비스하던 중, 새로운 모델을 수정하고, 모델 내용 변경 시 에러발생

이건 어떤 db를 쓰느냐에 관계없이 django에서 플젝 중간에 모델을 변경하고자 할때는 다 해당될 듯 하다.

제일 좋은 건, 무조건 프로젝트 시작 시에 짜는 model이 되도록 최종본이 될 것 ..
전에 해커톤에 나갔을 때도 중간에 model 내용 바꾸다가 대환장 에러파티 마주해서 힘들었던 기억이 있다. 그 때는 왕왕초보라서 에러 보는 법도 잘 모를 때라 ㄹㅇ 힘들었다. ㅋㅋㅋㅋㅋㅋ

현재 상황

# django models.py

class Nac(models.Model):
    user = models.CharField(max_length=50)
    time = models.DateTimeField()
    ip = models.CharField(max_length=64)
    result = models.CharField(max_length=10, null=True, blank=True)
    message = models.TextField(null=True, blank=True)
        
    #이건 admin에서 보여지는 데이터 이름을 예쁘게 하기 위함
    def __str__(self):
        pretty_time = str(self.time).split('+')
        return pretty_time[0]
        
...

이 상태로 서비스를 운영 중이라 이미 데이터도 꽤 쌓인 상태,,
그런데 새로운 기능을 추가로 요구하셔서 부득이 하게 user에 외래키로 연결하는 model을 새로 만들어 foreign key로 연결해야 했다.

변경한 모델

# django models.py

class Nac(models.Model):
    user = models.ForeignKey("Accessor", to_field="name", related_name="nac_user", on_delete=models.CASCADE)
    time = models.DateTimeField()
    ip = models.CharField(max_length=64)
    result = models.CharField(max_length=10, null=True, blank=True)
    message = models.TextField(null=True, blank=True)

    def __str__(self):
        pretty_time = str(self.time).split('+')
        return pretty_time[0]
        
...

class Accessor(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True, unique=True)
    access_ip = models.CharField(max_length=100, null=True, blank=True)
    aws_count = models.IntegerField(default=0)
    nac_count = models.IntegerField(default=0)
    vpn_count = models.IntegerField(default=0)
    nas_count = models.IntegerField(default=0)
    utm_count = models.IntegerField(default=0)

    def __str__(self):
        return self.name

이렇게 Accessor을 새로 만들어서 얘를 Nacuser부분에 외래키로 연결해줬다.

그리고나서 진행하는

python manage.py makemigrations

python manage.py migrate

그러면 에러가 난다.
캡쳐해두지 않은 에러 메시지..
에러 내용이 대충 존재하지 않는 필드라거나, 이미 있는 필드나 데이터에 대한 내용이였던 것으로 기억.

해결

해결: table을 모두 삭제 후, 재진행

django에서 mariadb로 연결 후, migrate를 진행하면 django_content_type , django_migrations, django_sessions 등 여러 기본 테이블이 자동 생성되는데 얘네들도 전부 지워줘야 한다.

삭제 진행 시, foreignkey로 연결 되어 있어서 삭제 할 수 없다는 뉘앙스의 에러 메시지가 나올 수 있는데, 이럴 경우에는 다른 테이블의 삭제를 먼저 시도해서 부모가 되는 모델을 먼저 지워준 후에, 지우면 성공적으로 지워진다.

물론 이렇게 하면 db는 초기화 된다 ^^*

데이터를 백업해뒀다가 다시 insert하는 코드를 짜서 넣으면 복구할 수 있겠다..

# 참고로 쓰는 mysql문법

# 서버(CentOS7)에서 mysql 접속
mysql -u [계정이름] -p[비밀번호]

# db목록
show databases;

# db선택
use [db이름];

# table목록
show tables;

# 전체 데이터 보기
select * from [table이름];

# 테이블 삭제
drop table [table이름];

# mysql 나가기
exit

성공~

profile
경험 == 배움

0개의 댓글