지금 개발하러갑니다

Flask-Migrate 에러 본문

서버 개발

Flask-Migrate 에러

jspark1215 2020. 1. 12. 22:57
Flask-Migrate 에러 해결 방법

Flask-Migrate 에러 해결 방법

Flask를 사용하여 서버 개발을 하게 되면 주로 SQLAlchemy를 사용하게 된다.

Flask-Migrate 에러 해결 방법

Flask를 사용하여 서버 개발을 하게 되면 주로 SQLAlchemy를 사용하게 된다.

개발을 진행하게 되다보면 model을 바꾸는 경우, 마이그레이션 작업을 진행해야하는데, 이때 SQLAlchemy를 위한 마이그레이션 툴, alembic을 사용하게 된다.

Flask에서 alembic의 사용을 편하게 만든 라이브러리가 있는데, 바로 Flask-Migrate이다. (https://flask-migrate.readthedocs.io/en/latest/)

Flask-Migrate를 사용하게 되면, 기존 Flask 프로젝트에 붙여서 매우 쉽게 마이그레이션을 수행할 수 있게 되고, Flask-Script와 연동하여 간편하게 사용할 수 있다.

나 또한, Flask, Flask-Script, Flask-Migrate를 사용하고 있었는데, 서버에 Flask 프로젝트를 배포하고 model을 수정할 일이 생겨 마이그레이션 작업을 진행하였는데, 아래와 같은 형태의 오류가 발생하였다.

db migrate 명령 실행시,

INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
ERROR [alembic.env] Target database is not up to date.

db upgrade 명령 실행시,

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation “user” already exists
[SQL: ‘\nCREATE TABLE “user” (\n\tid SERIAL NOT NULL, \n\tusername VARCHAR(40), \n\temail VARCHAR(120), \n\tpassword_hash VARCHAR(128), \n\tPRIMARY KEY (id)\n)\n\n’] (Background on this error at: http://sqlalche.me/e/f405)

Flask-Migrate를 사용한 정상적인 마이그레이션 단계는 다음과 같다.

flask db init
flask db migrate
flask db upgrade

그런데 위와 같은 상황에서는 upgrade, migrate 명령어 모두 정상적으로 작동하지 않으니 마이그레이션 작업을 진행할 수가 없다.

물론 데이터베이스 자체를 삭제하고 다시 테이블들을 생성하는 방법도 있지만 이러한 방법은 마이그레이션이 아니다.. 지금까지는 이러한 문제의 해결방법을 몰랐기에 어쩔 수 없었지만, 다행히도 Flask-Migrate 깃헙 이슈에 해당 오류에 대한 이슈가 있었고, 해결방법을 찾을 수 있었다.

flask db stamp head
flask db migrate

이러한 문제는 alembic_version 테이블이 삭제되었을 경우 발생한다고 한다.

flask db history 를 통해 마이그레이션 작업 내역을 확인할 수 있는데, 확인을 해서 실제 데이터베이스에 반영되지 않은 마이그레이션 파일내역들은 지우면 된다고 한다. 해결되지 않을 경우에는 위 방법을 사용한다.

Reference

https://github.com/miguelgrinberg/Flask-Migrate/issues/233

'서버 개발' 카테고리의 다른 글

Locust로 서버 성능 테스트하기  (0) 2020.01.12
SSH Key란? SSH Key 사용하기  (0) 2020.01.12
MQTT 프로토콜 - 와일드카드  (0) 2020.01.12
MQTT 프로토콜  (0) 2020.01.12
Comments