2014-01-31 67 views
0

我有一個基於Flask的應用程序,我試圖啓用遷移以管理數據庫結構更改。在我開始使用alembic和flask-migrate之前,我的數據庫不是空的,並且包含表和記錄。Alembic/Flask-migrate無法識別數據庫結構

首先,我試圖用蒸餾器獨立的,只是PIP安裝蒸餾器,然後配置一切,並使用自動生成產生差異。所有工作正常,但輸出不正是我所料:

INFO [alembic.autogenerate.compare] Detected removed table u'user' 
    Generating /Users/me/Documents/Project/app/migrations/versions/3de1151ce5de_.py ... done 

所以表用戶實際上是存在於我的數據庫(我認爲這是PostgreSQL中預留表),我從來沒有刪除它。另外,我還有一堆其他表似乎對alembic不可見的表格。起初我以爲我沒有正確配置alembic,所以我重新開始並決定嘗試this nice flask extension by Miguel Grinberg。這個設置很容易,但結果是完全一樣的信息。

任何想法我做錯了什麼?

編輯:我決定將我如何編輯我原來的蒸餾器env.py一些重要的信息:

.... 
import sys,os sys.path.append(os.getcwd()) 
import app from app import db 
target_metadata = db.metadata 

.... 

def run_migrations_online(): 
    """Run migrations in 'online' mode. 

    In this scenario we need to create an Engine 
    and associate a connection with the context. 

    """ 
    # all the models need to be imported so they are visible when migration runs 
    from app.models import Model1, Model2, Model3, Model4, Model5 

... 

這種變化是必要的蒸餾器,看看我的聲明的基礎和之前的任何車型遷移開始。放棄獨立的方法後,我只是遵循燒瓶遷移教程,並沒有觸及任何文件。

編輯:好的,所以我們已經刪除了'user'表。儘管如此,我的其他模型並沒有出現在腳本中。我認爲會發生什麼情況是因爲在創建遷移腳本之前啓動應用程序,所以sqlalechmy db.create_all()調用會創建表,這就是爲什麼alembic在colums vs模型中看不到任何區別。也許我打電話create_all()在錯誤的地方?

編輯:是的!就是這樣,我將db.create_all()移到以下manager.run()並且它現在檢測到更改正確。感謝所有的幫助!

回答

1

您的數據庫中有一個user表,它不在任何SQLAlchemy模型中表示。正確?

然後Alembic會假定您已經刪除了表,因爲所有的自動遷移腳本都會顯示您的應用程序中定義的模型和實際數據庫之間的差異。 Alembic無法知道您的數據庫中有一張表格可以被視爲免除遷移腳本。

在任何情況下,自動遷移功能都很棒,但它不應該完全「自動」。在使用它們之前,您總是必須查看生成的腳本並修復任何錯誤或不準確之處。

前進的方法是編輯遷移腳本以糾正此問題。把它拿走吧。遷移腳本的目的是手動編輯,不要害怕這樣做。

不幸的問題是,每次發佈新的遷移時,表刪除都會再次顯示。我不認爲Alembic有辦法提供例外。

+0

好的,但這隻能解決一半的問題。我知道每次都需要檢查自動創建的遷移腳本,但我的其他模型不會顯示 - 請參閱我編輯的問題。 – lawicko

+1

當您使用Flask-Migrate/Alembic時,不要調用'db.create_all()'。遷移框架將取代該呼叫。 – Miguel