我是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中)嗎?
而如何在燒瓶遷移列添加評論?
我應該使用Flask-Migrate嗎? – HFX
@HFX啊,好點。更新了答案。 – alecxe