2014-06-26 38 views
10

我試圖自動生成一個蒸餾器版本首次對預先存在的數據庫,但是當我運行下面的命令蒸餾器--autogenerate試圖重新創建每個表

alembic revision --autogenerate 

它會產生嘗試遷移在我的數據庫中創建每個表和索引。此類似:

def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    op.create_table('table1', 
    sa.Column('id', sa.SmallInteger(), nullable=False), 
    sa.Column('name', sa.String(length=100), nullable=True), 
    sa.Column('desc', sa.Text(), nullable=True), 
    sa.PrimaryKeyConstraint('id'), 
    sa.UniqueConstraint('name'), 
    schema='schema1' 
    ) 
    op.create_index(op.f('ix_index1'), 'table1', ['name'], unique=False, schema='schema1') 
    ... all my other tables/indexes .. 


def downgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    op.drop_index(op.f('ix_index1'), table_name='table1', schema='schema1') 
    op.drop_table('table1', schema='schema1') 
    ... all my other tables/indexes .. 

然後,如果我嘗試運行失敗的遷移,因爲對象已經存在:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "table1" already exists 

因此,它看起來對我來說,蒸餾器,認爲我的數據庫不包含任何表,但它確實。

任何想法,爲什麼會發生這種情況?

+0

難道你還沒有創建初始遷移? [http://alembic.zzzcomputing.com/zh-CN/latest/tutorial.html#running-our-first-migration](http://alembic.zzzcomputing.com/en/latest/tutorial.html#running-our -first-migration)根據你的問題來判斷,我假設你的數據庫已經創建好了。您需要告訴alembic DB的當前狀態,以便知道自動生成的內容。 – JJK

回答

1

配置蒸餾器看你的數據庫

你有target_metadata設爲您的基本元數據?

來自documentation

要使用autogenerate,我們首先需要修改我們的env.py,以便它 可以訪問包含目標的表格元數據對象。 假設我們的應用程序在myapp.mymodel中有一個聲明基礎。這個 基地包含一個MetaData對象,其中包含定義 我們的數據庫的表對象。我們確保將其加載到env.py中,然後通過target_metadata參數傳遞給 EnvironmentContext.configure()。 通用模板中使用的env.py示例腳本已經在頂部附近有一個 變量聲明,以方便我們使用 替換我們的MetaData中的None。與開始:

# add your model's MetaData object here 
# for 'autogenerate' support 
# from myapp import mymodel 
# target_metadata = mymodel.Base.metadata 
target_metadata = None 

我們更改爲:

from myapp.mymodel import Base 
target_metadata = Base.metadata