2015-12-22 57 views
0

我是Flask的新手。 我正在Flask-SQLAlchemy上工作,我也嘗試Flask-Migrate。在Flask-SQLAlchemy中,我應該使用create_all()在生產環境中創建表嗎?

快速創建生產和測試環境非常方便。

但我認爲它不如Django移植方便。

當我試圖創建多對多數據模型。有時 我得到了以下錯誤:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u' 
    CREATE TABLE ad_accounts (
    access_token_id INTEGER, 
    ad_account_id INTEGER, 
    FOREIGN KEY(access_token_id) REFERENCES fb_access_token (id), 
    FOREIGN KEY(ad_account_id) REFERENCES ad_account (id) 
    ) 
'] 

我的模型:

from sqlalchemy.dialects.mysql import BIGINT 

ad_accounts = db.Table('ad_accounts', 
    db.Column('access_token_id', db.Integer, db.ForeignKey('fb_access_token.id')), 
    db.Column('ad_account_id', db.Integer, db.ForeignKey('ad_account.id')) 
) 


class AdAccount(db.Model): 
    __bind_key__ = 'ads' 
    __tablename__ = 'ad_account' 

    id = db.Column(db.Integer, primary_key=True) 
    account_id = db.Column(BIGINT(unsigned=True), default=None) 
    account_status = db.Column(db.Integer, default=None) 
    business_name = db.Column(db.String(255), default='') 
    owner = db.Column(db.String(255), default='') 
    timezone_name = db.Column(db.String(255), default='') 
    created_time = db.Column(db.Integer, default=0) 
    activities = db.relationship('Activity', backref='ad_account', lazy='dynamic') 


class FbAccessToken(db.Model): 
    __bind_key__ = 'ads' 
    __tablename__ = 'fb_access_token' 

    id   = db.Column(db.Integer, primary_key=True) 
    admin_id  = db.Column(db.Integer, db.ForeignKey('admin_user.admin_id')) 
    # fb_account_id = db.Column(db.String(32), default='') 
    ad_accounts = db.relationship('AdAccount', secondary=ad_accounts, backref='access_token_list', lazy='dynamic') 
    update_time = db.Column(db.Integer, default=0) 
    page_id  = db.Column(BIGINT(unsigned=True), default=0) 
    current_account_id = db.Column(BIGINT(unsigned=True), nullable=True) 

,當我在產品envirment的運行「蟒蛇app.py數據庫升級」每一次,我害怕打破它下。

有人告訴我,我應該通過手動SQL來改變表格。

我現在很困惑,我想以一種方便的方式做到這一點,我曾經在django遷移中做到這一點。

假設我已經在產品環境中創建了數據庫和表,還需要執行create_all或'python app.py db upgrade'(在Flask-Migrate中)嗎?


而如何在燒瓶遷移列添加評論?

回答

1

在現有的數據庫中,在生產中,您顯然不希望重新創建數據庫模式並丟失任何現有數據。考慮數據庫遷移,這裏有相關的包:

+0

我應該使用Flask-Migrate嗎? – HFX

+0

@HFX啊,好點。更新了答案。 – alecxe

0

我真的不知道你想要什麼! 我認爲燒瓶遷移是一個很好的工具,但它有一些侷限性,因爲它在this中顯示,因爲alembic沒有檢測到每個遷移您必須通過添加外鍵名稱來編輯遷移腳本時使用它們,如在蒸餾器文檔here中所述。 我面臨與我的遷移相同的問題,我通過手動添加前綴鍵名稱來編輯floder'/ migration/version'中的遷移腳本來解決它!與這行代碼

sa.ForeignKeyConstraint(['access_token_id'], ['fb_access_token.id'],use_alter=True, name='fk_fb_access_token.id_id'), 

,或者如果你不喜歡編輯遷移腳本可以使用對象

ForeignKeyConstraint 

,而不是

db.ForeignKey() 

,並給它的所有參數定義你的foreignKeys時的特殊名字 但總的來說,這是因爲你需要命名外鍵並且不使用默認名稱

相關問題