FLASK - flask db migrate 및 update 기능 관련

환경 : MYSQL, FLASK

해당 부분이 얼마나 잘 Migrate 되고, 업데이트 되는가 봤는데요.
최초에 init할때는 PK,FK 잘 지정되어 반영되는데,

flask db stamp head(해당 지점으로 초기화)
flask db migrate
flask db upgrade
하면 upgrade시 PK,FK반영이 안되네요.

예를 들면, 기존에 PK가 id가 인걸 하단 처럼 question_id 와 answer_id로 바꾸는 경우입니다.
그런데, migration폴더 지우고, 테이블지우고 db init 하면 되네요.
위 과정처럼 migration폴더와 테이블을 지우지 않고 db migrate로만 되면 좋을 것 같은데, 이렇게 되지는 않네요.

AS IS

class Question(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)


class Answer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('question.question_id', ondelete='CASCADE'))
    question = db.relationship('Question', backref=db.backref('answer_set'))
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

TO BE

class Question(db.Model):
    question_id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)


class Answer(db.Model):
    answer_id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('question.question_id', ondelete='CASCADE'))
    question = db.relationship('Question', backref=db.backref('answer_set'))
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

혹시나 저자님도 이렇게 해보신적이 있나요?
이 경우 혹여나 DB PK를 바꾼다거나 할 때, 번거롭게 위처럼 DB INIT을 다시해주고, 테이블을 지우고 DB와 객체를 맵핑하는 작업을 한다면, 마이그레이션 등 골치아플거로 생각이 되서요.

감사합니다.

real7lucky 656

M 2020년 11월 11일 8:40 오후

목록으로
1개의 답변이 있습니다. 1 / 1 Page

해 보지는 않았지만 PK를 위처럼 변경한다면 아마도 column을 추가하고 삭제하도록 리비전이 생성될거 같네요.
그렇게 되면 당연히 Null 오류가 발생하고 뭔가 꼬이는 상황이 발생할 것 같습니다.

이런 경우에는 flask db migrate로 생성되는 리비전 파일을 열어서 upgrade 함수를 수동으로 수정하는 것이 좋을 것 같습니다.

op.execute("ALTER TABLE ... ") 이런식으로 테이블을 변경하는 쿼리문을 실행하도록 수정해야 할 것 같네요.

mysql pk를 변경하는 alter문은 다음을 참조해 보세요.

https://stackoverflow.com/questions/2703126/how-do-i-rename-a-primary-key-column-in-mysql

박응용

2020년 11월 11일 9:02 오후