2017-10-30 12 views
0

2 개의 마이그레이션 스크립트가 있습니다.이상한 놀랍게도 행동

스크립트 1 : 자료

from models import EntityProperty 
from contextlib import contextmanager 

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

from alembic import op  # noqa 
import sqlalchemy as sa  # noqa 


@contextmanager 
def session_scope(): 
    session = sa.orm.session.Session(bind=op.get_bind()) 
    try: 
     yield session 
     session.commit() 
    except: 
     session.rollback() 
     raise 
    finally: 
     session.close() 


def _upgrade(session): 
    properties = session.query(EntityProperty).filter(
     ~EntityProperty._ptype.in_(["AI", "AO", "AV"]) 
    ).all() 

    for _property in properties: 
     _property._cov_increment = None 


def upgrade(): 
    with session_scope() as session: 
    _upgrade(session) 


def downgrade(): 
    pass 

스크립트 2 : 나는 기본으로 다운 그레이드 할 때

revision = 'ab47480a7be7' 
down_revision = u'ecbde8fa83e3' 
branch_labels = None 
depends_on = None 

from alembic import op  # noqa 
import sqlalchemy as sa  # noqa 


def upgrade(): 
    # add bacnet_enable to EP 
    with op.batch_alter_table(u'entityproperties', schema=None) as batch_op: 
     batch_op.execute("PRAGMA foreign_keys=OFF;") 
     batch_op.add_column(
      sa.Column(
       'bacnet_object', sa.Boolean(), nullable=True, 
       server_default=expression.true())) 


def downgrade(): 
    with op.batch_alter_table(u'entityproperties', schema=None) as batch_op: 
     batch_op.drop_column('bacnet_object') 

는 지금, 나는 오류가 나타 얻을

그러한 열이 : entityproperties.bacnet_object

이 오류는 기본 스크립트 (스크립트 1)를 실행하는 동안 생성됩니다. 내가 생성 된 SQL을 확인하고는

왜 bacnet_object 열이 script1이 실행 중에 요구되고있다 AS entityproperties_bacnet_object

entityproperties.bacnet_object이있다? Script2의 다운 그레이드는 EntityProperty 테이블에서 열을 제거해야합니다. 여기서 내가 뭘 잘못하고 있니?

업데이트 : 두 번째 스크립트가 실행 된 후에 db를 확인했습니다. EntityProperty 테이블에 bacnet_object라는 열이 없지만 생성 된 SQL이 bacnet_object 열을 찾고 있습니까?

답변

0

내 질문에 답변.

마이그레이션 스크립트에서 응용 프로그램의 모델을 가져올 때 이와 같은 문제가 발생할 수 있습니다. 각 마이그레이션 파일은 스키마 설계 시점을 나타내므로 은 현재 모델과 매우 다를 수 있습니다. 마이그레이션 중 현재 모델과 가져온 모델의 차이로 인해 문제가 발생할 수 있습니다.

해결 방법은 마이그레이션 스크립트 자체에서 테이블 메타 데이터를 만드는 것입니다. 마이그레이션 스크립트에 사용될 기본 키와 열만 테이블의 모든 열을 필요로하지 않습니다. 스크립트에서 모델을 만들면 업데이트시 세션을 만들 수 있습니다. 수정 자 스크립트 1은 다음과 같습니다.

""" 
""" 
from __future__ import unicode_literals 
from __future__ import absolute_import 

from contextlib import contextmanager 
from sqlalchemy.ext.declarative import declarative_base 

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

from alembic import op  # noqa 
import sqlalchemy as sa  # noqa 


Base = declarative_base() 


class EntityProperty(Base): 

    __tablename__ = "entityproperties" 
    _uuid = sa.Column(sa.String, primary_key=True, nullable=False) 
    _ptype = sa.Column(sa.String, nullable=False) 
    _protourl = sa.Column(sa.String) 


@contextmanager 
def session_scope(): 
    session = sa.orm.session.Session(bind=op.get_bind()) 
    try: 
     yield session 
     session.commit() 
    except: 
     session.rollback() 
     raise 
    finally: 
     session.close() 


def _upgrade(session): 
    properties = session.query(EntityProperty).filter(
     ~EntityProperty._ptype.in_(["AI", "AO", "AV"]) 
    ).all() 

    for _property in properties: 
     _property._cov_increment = None 


def upgrade(): 
    with session_scope() as session: 
     _upgrade(session) 


def downgrade(): 
    pass