2016-08-10 2 views
4

웹 응용 프로그램은 피라미드 프레임 워크의 sqlalchemy를 기반으로하며 데이터베이스 마이그레이션 관리를 위해 alembic을 사용하려고합니다. 웹 응용 프로그램은 하나의 데이터베이스에서 작동하는 다양한 패키지로 구성됩니다. 따라서 마이그레이션해야하는 여러 models.py가 있음을 의미합니다. 나는 이것을 어떻게 처리해야하는지 혼란 스럽다. 내 env.py에서 다음을 사용하여 멀리까지 진행할 수 있습니다.alembic을 사용하여 여러 models.py 처리

from pkg_a.app.models import Base as pkg_a_base 
from pkg_b.app.models import Base as pkg_b_base 
from pkg_c.app.models import Base as pkg_c_base 

def combine_metadata(*args): 
    m = MetaData() 
    for metadata in args: 
     for t in metadata.tables.values(): 
      t.tometadata(m) 
    return m 
target_metadata = combine_metadata(pkg_a_base, pkg_b_base, pkg_c_base) 

위대한 작품입니다. 그러나 나중에 하나 이상의 모델을 추가하면이 목록에 모델을 추가하는 것만으로는 충분하지 않습니다. 나는

alembic revision -m "added a new model pkg_d.models" --version-path=migrations/versions --autogenerate 

를 실행하는 pkg_d.models에서 테이블을 추가하는 코드를하는 새로운 버전의 파일을 생성 할 것이라고 기대했다. 그러나 그렇지 않습니다. 내가 여기서 잘못하고있는 것은 무엇인가.

답변

4

패키지가 완전히 독립적이며 개별 패키지 인 경우 각 패키지에는 각 패키지 (pkg_a.migrations, pkg_b.migrations 등)에 저장되어 있거나 별도의 최상위 마이그레이션 디렉토리에 최소한 명령을 증류기에 -n 매개 변수를 사용하여 별도의 alembic.ini 섹션 및 사용할 섹션을 지정합니다 :

[pkg_a] 
# path to migration scripts 
script_location = migrations_a 
sqlalchemy.url = xxx 

[pkg_b] 
script_location = migrations_b 
sqlalchemy.url = xxx 

[pkg_c] 
script_location = migrations_c 
sqlalchemy.url = xxx 

을 그리고 당신은, 그러나, 당신의 모델은 어떤 방식으로 의존하는 경우 alembic revision -n pkg_a -m "added a new model pkg_a.models"

를 사용 할 수 있습니다 일 그들은 공통베이스를 사용해야합니다 - 모든 SQLAlchemy 항목을 단일 파일 models.py에 보관할 필요가 없다는 것을 알고 있습니까? 나는 다른 MetaData, Base 및 기타 SQLAlchemy 구성 요소를 포함하는 별도의 "기본"패키지를 작성하여 다른 패키지에서 가져올 수 있습니다.

+0

세르게이. 우리 모델에는 몇 가지 의존성 계층이 있습니다. 그리고 예, 그것은 하나의 models.py에 모든 것을 채우는 것이 가장 바람직하지 않습니다. 우리가 수행 한 것과 다른 별도의 기본 패키지를 만들 때 우리가해야 할 추가 작업은 아마도 메타 데이터 인스턴스를 만들어서 declarative_base에 전달하는 것뿐입니다. 그 맞습니까 ? 이렇게하면 target_metadata = Base.metadata가 모든 테이블을 연결합니까? alembic 개정 검사 프로세스가 Base로부터 누구를 상속하는지 알아내는 방법은 무엇입니까? –

관련 문제