[장고 에러] OperationalError: Unknown column
Django 프로젝트에서 새로운 모델을 추가하고 기존 모델에 필드를 추가하는 과정에서 예상치 못한 오류가 발생할 수 있습니다. 이번 글에서는 새로운 Category 모델을 생성하고 기존의 Post 모델에 ForeignKey 필드를 추가한 후 발생한 OperationalError: Unknown column 'posts_post.category' in field list. 에러를 해결하는 방법을 다룹니다.
에러의 원인 분석
에러 메시지는 데이터베이스 쿼리에서 posts_post 테이블에 category 필드가 없다는 것을 의미합니다. 코드에서는 분명히 category 필드를 추가했지만, 데이터베이스에서는 이를 인식하지 못한 상황입니다. 문제를 해결하기 위해 여러 단계를 거쳐 원인을 분석해야 했습니다. 코드에는 문제가 없었지만 데이터베이스를 직접 조회한 결과 category 필드가 존재하는 것을 확인했습니다.
해결 방법: 필드 삭제 후 재추가
인터넷에서 찾은 해결 방법 중 가장 간단하고 효과적인 방법은 테이블을 삭제하고 다시 생성하는 것입니다. 하지만 기존 데이터가 중요한 경우, 이는 적절하지 않습니다. 대신 문제가 되는 필드만 제거했다가 다시 추가하는 방법을 사용합니다. 이때 데이터를 백업하는 것은 필수입니다.
해결 방법: 필드 삭제 후 재추가
인터넷에서 찾은 해결 방법 중 가장 간단하고 효과적인 방법은 테이블을 삭제하고 다시 생성하는 것입니다. 하지만 기존 데이터가 중요한 경우, 이는 적절하지 않습니다. 대신 문제가 되는 필드만 제거했다가 다시 추가하는 방법을 사용합니다. 이때 데이터를 백업하는 것은 필수입니다.
① 장고로 필드 제거 및 재추가
먼저 models.py 파일에서 category 필드를 주석 처리하고 마이그레이션을 진행합니다.
# category = models.ForeignKey(Category, on_delete=models.CASCADE)
터미널에서 다음 명령어를 실행합니다.
$ python3 manage.py makemigrations
$ python3 manage.py migrate
필드가 제거되었으면 주석을 해제한 후 다시 마이그레이션을 진행합니다.
category = models.ForeignKey(Category, on_delete=models.CASCADE)
다시 터미널에서 다음 명령어를 실행합니다.
$ python3 manage.py makemigrations
$ python3 manage.py migrate
② 데데이터베이스에서 직접 필드 제거
만약 위 방법으로 해결되지 않는다면, 데이터베이스에서 직접 필드를 제거해야 합니다. MySQL을 사용하고 있다면 다음과 같은 과정을 거칩니다.
특정 필드를 데이터베이스에서 직접 제거하는 과정
먼저, DB 쉘을 실행합니다.
$ python3 manage.py dbshell
데이터베이스 목록을 조회합니다.
mysql> SHOW databases;
+--------------------+
| Database |
+--------------------+
| mysite |
| first_blog |
| example |
+--------------------+
3 rows in set (0.00 sec)
사용 중인 데이터베이스를 선택합니다.
mysql> USE mysite;
테이블 목록을 확인합니다.
mysql> SHOW tables;
+--------------------------------------+
| Tables_in_coding_education |
+--------------------------------------+
| accounts_customuser |
| accounts_customuser_groups |
| accounts_customuser_user_permissions |
| auth_group |
| auth_group_permissions |
| auth_permission |
| posts_post |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+--------------------------------------+
문제가 되는 category 필드를 제거합니다.
mysql> ALTER TABLE posts_post DROP COLUMN category;
새 마이그레이션 적용하기
이제 models.py에서 category 필드를 주석 처리하거나 삭제합니다. 그리고 새로운 마이그레이션을 생성합니다.
$ python3 manage.py makemigrations
데이터베이스 구조가 변경되었으므로 fake 옵션을 사용하여 마이그레이션을 적용합니다.
$ python3 manage.py migrate --fake
결론
이러한 과정을 통해 OperationalError: Unknown column 'posts_post.category' in field list. 에러를 해결할 수 있습니다. 필드 추가 및 데이터베이스 마이그레이션 과정에서 예상치 못한 오류가 발생할 수 있지만, 문제의 원인을 정확히 파악하고 적절한 해결 방법을 적용하면 해결할 수 있습니다. 데이터베이스 작업은 항상 신중하게 진행하고, 중요한 데이터는 백업하는 습관을 가지는 것이 좋습니다.