해결된 질문
작성
·
41
0
26강에서 User model를 만들고, Task model의 관계 설정까지 하고 env.py에서 User를 임포트하고 난후 alembic revision --autogenerate를 실행하고, alembic upgrade head 를 실행하면 User 테이블과 Task 모델의 관계설정은 잘 만들어 졌지만,
아래에 보이는 것처럼, 제약조건에 name을 지정하라고 나옴니다.
그래서 name을 지정하고 db를 삭제하고, alembic을 초기화된 상태로 만든 후에 다시 똑같은 과정을 거쳐 실행햇는데, 두번째 alembic revision --autogenerate 을 실행하면, sqlalchemy.exc.NoReferencedColumnError: Could not initialize target column for ForeignKey 'users.id' on table 'tasks': table 'users' has no column named 'id' 이런 오류가 나타납니다.
자꾸 자꾸 계속해서 다시 해봐도 제약조건에 이름을 넣으라고 나오고, 그것을 수정하면 users에 id가 없다는 둥 계속 똑같이 오류가 나옵니다. 해결 방법은 무엇일까요? 완전히 새로 해봐도 똑같은 오류만 계속 반복됩니다.
답변 3
1
오~~~ 인프런 AI 인턴님!
대단하십니다. name을 외래키 밖에 적었었네요... 외래키 안에 넣엇더니 잘 되는군요... 감사합니다. 아래의 차이가 그런 걸 만들었었네요~~^^
owner_id = Column(Integer, ForeignKey('users.id'), name='fk_user_task', nullable=False)
이처럼 하면 안되고... 아래 처럼 외래키 안에 이름을 넣어야 하는 군요..
owner_id = Column(Integer, ForeignKey('users.id', name='fk_user_task'), nullable=False)
0
0
안녕하세요, 인프런 AI 인턴입니다. moljin님.
현재 발생하고 있는 문제는 Alembic
을 사용하여 SQLAlchemy
모델을 마이그레이션할 때, 외래 키 설정에 대한 문제로 보입니다. 이를 해결하기 위해 다음과 같은 몇 가지 방법을 고려해볼 수 있습니다:
ForeignKey
객체를 사용할 때, 다음과 같이 name
속성을 명시하여 해결할 수 있습니다. from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
class Task(Base):
__tablename__ = 'tasks'
id = Column(Integer, primary_key=True, index=True)
owner_id = Column(Integer, ForeignKey('users.id', name='fk_user_task'), nullable=False)
owner = relationship("User", back_populates="tasks")
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
tasks = relationship("Task", back_populates="owner")
Alembic 버전 파일 확인:
기존에 생성된 alembic_version
파일 중 누락된 또는 손상된 부분이 있는지 확인하시고, 해당 부분을 삭제한 후 다시 생성해보세요.
데이터베이스 스키마 초기화:
문제가 계속 발생한다면, 데이터베이스를 완전히 삭제하고, 다시 생성한 다음 처음부터 모델을 정의하고 마이그레이션 파일을 생성해보세요.
수정된 모델 적용:
모든 모델이 최신 상태로 저장되어 있는지 확인하고, alembic upgrade head
를 사용하여 데이터베이스에 반영하세요.
위의 방법들을 하나씩 시도하며 문제를 해결해보시기 바랍니다. 추가적으로, Q&A 게시판의 비슷한 에러 질문에서 유사한 사례를 참고할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.