인프런 커뮤니티 질문&답변

TV 으악맨 (읅!)님의 프로필 이미지
TV 으악맨 (읅!)

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

JSON 직렬화

migrate 오류

작성

·

724

0

뭐가 문제인지 모르겠습니다 일단 강의내용대로 똑같이 실행했구요 41분 지점입니다

django.db.utils.IntegrityError: The row in table 'instagram_post' with primary key '1' has an invalid foreign key: instagram_post.author_id contains a value '1' that does not have a corresponding value in auth_user.id.

해당 에러가 뜹니다.  느낌상 db.sqlite를 지우면 될거같지만 안지우고 해결도 해보고 싶습니다.

우선 제대로 했는지 확인하기 위해서 migrate 0001로 돌리고 몇번 시도해봤구요 결과는 같았습니다

showmigrate 상태를 확인해봤습니다

instagram

 [X] 0001_initial

 [ ] 0002_post_author

저상태가 계속 유지되어있구요 

migrate 값설정할때 2로 줘봤는데 마찬가지였습니다 

db.sqlite를 실행해서  봤습니다 이게 맞는진 모르겠는데

sqlite> pragma table_info(auth_user);

0|id|integer|1||1

1|password|varchar(128)|1||0

2|last_login|datetime|0||0

3|is_superuser|bool|1||0

4|username|varchar(150)|1||0

5|first_name|varchar(30)|1||0

6|email|varchar(254)|1||0

7|is_staff|bool|1||0

8|is_active|bool|1||0

9|date_joined|datetime|1||0

10|last_name|varchar(150)|1||0

모델에 정의하지 않은 값도 있는것 같습니다

원래 기본값인지에 대해서는 잘모르겠습니다

어떻게 해결하면 좋을까요?

간단하게 실험해봤는데 db날리고 migrate하니까 정상작동 하네요 딴짓 한게 없는거같은데 db가 꼬여있는것 같네요 이럴때 진석님은 기존 디비를 유지하면서 어떻게 디버깅 하시나요?

추가로 시도해본건 기존 유저가 없어서라는 이유도 있다길래 유저 추가해서 시도해봤는데 이것역시 해결책은 아니였네요

답변 5

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

알려주신 모델 구성으로

Post 모델에 message/created_at/updated_at 필드만 두고 0001 마이그레이션을 생성/적용한 뒤에

Post 모델에 author FK 필드를 추가하고 0002 마이그레이션을 생성하였고, one-off 디폴트값으로 1을 지정하였습니다. 이는 1회성 디폴트값으로 pk=1인 User를 참조하는 외래키를 생성한다는 의미이죠.

그리고, 0002 마이그레이션을 적용하는 과정에서 아래와 같이 (상황.1 ) IntegrityError가 발생하였습니다. 이는 제가 User가 없어서 발생한 상황이구요.

제가 직접 생성한 0001/0002 마이그레이션 내역도 보여주신 내역과 일치하였습니다.

상황2에서 createsuperuser 명령으로 pk=1인 User를 생성하였으며,

상황3에서 이제 migrate를 해보면 정상적으로 잘 동작했습니다.

일단 제가 테스트해본 것은 위와 같구요. 이와 비교해서 차근차근 확인해보시겠어요?

화이팅입니다. :-)

감사합니다

1

이진석님의 프로필 이미지
이진석
지식공유자

흠. 마지막에 유저를 추가해보셨다고 하셨는 데,

현재의 Post 모델 코드 내역과, db에 접속하셔서 select * from instagram_post 내역과 select * from auth_user; 내역을 보여주시겠어요?

쿼리문에 대한 내역 2번째 답변으로 남겨두었습니다!

모델,마이그래이션 내역 올렸습니다 들여쓰기가 붙여넣는 과정에서 무시된점 양해바랍니다

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

Post 모델의 author 필드를 User 모델에 대한 외래키를 지정하였고, 이는 DB에 외래키 제약사항이 적용됩니다.

외래키 제약사항이 적용되면, Post 모델에 User(pk=1)과 외래키를 맺을려고 하면, 필히 DB에 User(pk=1)인 Row가 있어야만 합니다.

아래 오류는

The row in table 'instagram_post' with primary key '1' has an invalid foreign key

기존 Post 모델에 author 필드를 추가하시면서 생성된 마이그레이션에서 외래키 제약사항과 함께 author_id 필드를 추가할려고 하니, User 모델에 관련 Row가 없다는 것이구요.

마이그레이션은 DB 데이터 상황도 적절히 맞아야 동작을 합니다. DB에 대한 마이그레이션이니 어찌보면 당연한 이야기지요.

아마도 User 모델에 Rows가 없으실 듯 한데요. migrate 하시기 전에 createsuperuser 명령으로 새로운 유저를 생성하신 후에, 다시 migrate 해보시면 어떠실까요?

0

instagram/models.py

from django.db import models
from django.conf import settings


class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

instagram/migrations/0001_initail.py

# Generated by Django 3.0.14 on 2021-12-21 15:18

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('message', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
]

0002_post_author.py

# Generated by Django 3.0.14 on 2021-12-22 17:49

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('instagram', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='post',
name='author',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
preserve_default=False,
),
]

이렇습니다

0

sqlite 정말 하나도모르는데 명령어까지 다적어주셔서 감사합니다 :)

================================================================

sqlite> select * from instagram_post

   ...> ;

1|안녕하세요 첫번째 포스팅|2021-12-21 15:24:37.449059|2021-12-21 15:24:37.449101

2|두번째 포스팅|2021-12-21 15:30:30.485619|2021-12-21 15:30:30.485652

3|세번째 포스팅|2021-12-21 15:36:52.745147|2021-12-21 15:36:52.745179

4|네번째 포스팅|2021-12-21 15:40:30.999893|2021-12-21 15:40:30.999932

===================================================================

sqlite> select * from auth_user;

1|pbkdf2_sha256$180000$dBsCkZetnZvM$qXlv0OEnbKchFDnIJAC6EQh96T4Aw8xgytbTVz6nKnQ=|2021-12-22 18:07:43.912625|1|jun|||1|1|2021-12-22 18:07:13.624339|

===================================================================

요청하신 내역은 이렇습니다 해당 디비에서는 여전히 같은오류를 뿜고있구요

public/ 접속시

OperationalError at /public/

no such column: instagram_post.author_id

이런 에러를 뿜고요

post/ 역시

OperationalError at /post/

no such column: instagram_post.author_id

당연한 거긴하지만 현재 이런상태다를 좀 구체적으로 전해드리고 싶었습니다

 

이진석님의 프로필 이미지
이진석
지식공유자

모델 코드 내역과 마이그레이션 0001 0002 내역도 같이 보여주시겠어요?

TV 으악맨 (읅!)님의 프로필 이미지
TV 으악맨 (읅!)

작성한 질문수

질문하기