2017-02-28 4 views
0

로컬 db의 변경 사항을 클라우드 db에 적용하고 싶습니다.플라스크 마이 그 레이션을 통해 준비 데이터베이스를 업그레이드하기가 어렵습니다.

로컬 데이터베이스에는 User, email_history, event_monitor 세 개의 테이블이 있습니다. 로컬 마이그레이션 폴더를 삭제 한 다음 python manage.py db init, python manage.py db migrate 명령을 실행했습니다.

아래와 같이 수정 파일을 생성합니다.

"""empty message 

Revision ID: 9bd307a576ce 
Revises: 
Create Date: 2017-03-01 00:10:32.344698 

""" 
from alembic import op 
import sqlalchemy as sa 
from sqlalchemy.dialects import mysql 

# revision identifiers, used by Alembic. 
revision = '9bd307a576ce' 
down_revision = None 
branch_labels = None 
depends_on = None 


def upgrade(): 
    # ### commands auto generated by Alembic - please adjust! ### 
    op.drop_table('user') 
    op.drop_table('email_history') 
    op.drop_table('event_monitor') 
    # ### end Alembic commands ### 


def downgrade(): 
    # ### commands auto generated by Alembic - please adjust! ### 
    op.create_table('event_monitor', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('event_type', mysql.VARCHAR(length=80), nullable=True), 
    sa.Column('event_description', mysql.TEXT(), nullable=True), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    op.create_table('email_history', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('user_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False), 
    sa.Column('email_type', mysql.ENUM(u'SAMPLE'), nullable=True), 
    sa.Column('datetime_created', mysql.DATETIME(), nullable=True), 
    sa.Column('datetime_sent', mysql.DATETIME(), nullable=True), 
    sa.Column('status', mysql.TINYINT(display_width=1), autoincrement=False, nullable=False), 
    sa.ForeignKeyConstraint(['user_id'], [u'user.id'], name=u'email_history_ibfk_1', ondelete=u'CASCADE'), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    op.create_table('user', 
    sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), 
    sa.Column('username', mysql.VARCHAR(length=80), nullable=True), 
    sa.Column('email', mysql.VARCHAR(length=120), nullable=False), 
    sa.Column('password_hash', mysql.VARCHAR(length=256), nullable=True), 
    sa.PrimaryKeyConstraint('id'), 
    mysql_default_charset=u'latin1', 
    mysql_engine=u'InnoDB' 
    ) 
    # ### end Alembic commands ### 

내가

export config=prod && python manage.py db upgrade 

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1051, "Unknown table 's2sdevdb.user'") [SQL: u'\nDROP TABLE user'] 오류를 수행합니다. 네, 이미 클라우드 DB에서 제 테이블을 삭제했습니다.

내 질문은 왜 마이그레이션 명령이 테이블을 만드는 코드를 만들지 못하는 이유입니까? 어떻게이 일을 성취합니까?

답변

1

로컬에서는 마이그레이션을 삭제했지만 데이터는 여전히 존재합니다. 마이 그 레이션을 생성 할 때, Alembic은 코드를보고 몇몇 모델을 찾고, 데이터베이스를보고 여전히 존재하는 테이블을 찾는다. 그래서 테이블을 생성하는 코드를 생성하지 않는다.

아마도 drop 명령을 생성 한 세 테이블을 나타내는 모델이 더 이상 존재하지 않습니다.

모든 모델을 나타내는 마이그레이션을 만들려면 데이터베이스가 비어 있어야합니다. 테이블을 삭제하거나 빈 데이터베이스를 가리 킵니다. Alembic은 사용자가 삭제해야 할 수도있는 alembic_version 테이블을 생성합니다.


원격으로 테이블을 삭제 한 다음 테이블을 삭제하는 마이그레이션을 실행하려고했습니다. 주어진 이유로 실패합니다. 테이블이 삭제되지 않습니다.

수동으로 마이그레이션을 수행하고 수행 했으므로 manage.py db stamp head을 사용하여 데이터베이스가 이미 현재 마이그레이션을 나타내 었다고 Alembic에 알리십시오.

실제로 원격 데이터베이스를 재설정했다고 가정하면 표시 한 명령이 새 마이그레이션을 실행하는 데 적합합니다.