pythonanywhere에서 DB 마이그레이션(migration) 하기
https://flask-migrate.readthedocs.io/
로컬 마이그레이션
set FLASK_APP=main.py
1. 마이그레이션 폴더를 추가함
flask db init
2. 마이그레이션 파일 생성
(생성된 파일을 잘 봐야 한다고 함. 왜냐면 테이블 이름이나 칼럼 이름을 바꿀경우 수동으로 수정 필요)
$ flask db migrate -m "Initial migration."
3. 마이그레이션 적용
$ flask db upgrade
깃 커밋
1. 깃 커밋 후 푸쉬
파이썬 애니웨어에 적용
1. 파이썬 애니웨어에서 git pull (이를통해 적용을 시킬 파일까지 불러 올 수 있다.)
2. 파이선 애니웨어에서도 마이그레이션 적용
$ flask db upgrade
※ 호스팅한 서버의 마이그레이션 파일과 개발서버의 마이그레이션 파일이 같으면 문제가 날 가능성이 적을 겉이다.
이렇게 마이그레이션이 작동이 안되는 경우 해결법
해결법 1. 마이그레이션 관련 파일 삭제 후 초기화
로컬
1. 다운그레이드로 디비를 되돌림
2. migration 폴더를 삭제 + alembic_version 테이블을 제거
3. 마이그레이션 폴더를 추가함
flask db init
4. 마이그레이션 파일 생성
(생성된 파일을 잘 봐야 한다고 함. 왜냐면 테이블 이름이나 칼럼 이름을 바꿀경우 수동으로 수정 필요)
$ flask db migrate -m "Initial migration."
5. 마이그레이션 적용
$ flask db upgrade
6. git push
적용서버
1. alembic_version테이블 제거
2. 깃 풀로 새로 만들어진 마이그레이션 파일을 다시 받아옴
3. 마이그레이션 파일 적용
export FLASK_APP=main.py
$ flask db upgrade
해결법 2.
서버와 같게 만들어줌 - python anywhere에서 bash가 아닌 mysql을 클릭
1. alembic_version을 업그레이드 이전 버전으로 맞춤.
2. 만약 alembic_version테이블 자체가 없으면 sql 쿼리를 통해 테이블 생성을 함
-- 테이블 만들기
CREATE TABLE alembic_version (
version_num varchar(32) NOT NULL PRIMARY KEY
);
-- 테이블에 데이타 변경하기
UPDATE alembic_version SET version_num = '52220a6a6d76' WHERE version_num = 'c2d3b91fd96e';
-- 마이그레이션에 엉뚱한 쿼리가 있으면 변경해 줌
$ flask db upgrade
해결법 3. 마이그레이션을 안쓰는법
sql문을 써서 직접 실제 서버의 테이블을 업데이트를 한뒤 ( ALTER TABLE 아래 링크는 sql로 수정하는 법)
※ 유용한 쿼리 show tables;, describe <table name>;
그냥 git으로 파일을 push 한뒤 sql로 테이블 구조를 바꾸고 alembic_version 테이블에 값을 로컬에 있는 것과 똑같이 만들어줌
UPDATE alembic_version SET version_num = '52220a6a6d76' WHERE version_num = 'c2d3b91fd96e';
- nullable= false 인 필드를 추가 시켜야 하는 경우
간단하게 말하자면 이건 자동이 아니다. ㅠㅠ 직접 마이그레이션 파일을 수정하는 것이다.
nullable = false로 바로 했을 경우 기존에 있던 row들에 값이 없기 때문에
먼저 nullable = true로 만들어준 뒤 기존 필드에 값을 넣고 그걸 nullable =false로 바꾸어주는 방법이다.
-nullable = false면서 unique면...
nullable을 true로 바꾸고 기존에 값에 unique한 값 (row의 index나 uid) 을 넣어준 뒤
nullable을 false로 바꾸면 될 것이다.
-메이저 체인지는 인식하는데(삭제, 생성) 값의 크기가 변경됬을때 작동 안하면
compare_type = True 추가해줘야함 (어디에 추가하는지 중요) 링크 참조
- 만약 개발서버에서는 sqlite를 쓰고 실서버를 mysql을 쓰는 경우 엄청 고생하게 됨.
'Computer 관심 > Flask' 카테고리의 다른 글
[flask] sqlalchemy로 디비 입력시 None 에러 (0) | 2022.06.28 |
---|---|
플라스크 팩토리 패턴으로 바꾸기 (0) | 2022.01.13 |
sqlalchemy 사용시 db object를 jason으로 바꾸는 방법 (0) | 2021.09.24 |
2) 플라스크 api pythonanywhere MYSQL DB와 연결하기 (0) | 2021.09.23 |
1) 플라스크 api 서버 pythonanywhere에 배포 (0) | 2021.09.20 |