在Flask-SQLAlchemy中,我应该使用create_all()在生产环境中创建表吗?

时间:2015-12-22 03:04:24

标签: python flask flask-sqlalchemy

我是Flask的新手。 我正在使用Flask-SQLAlchemy,我也尝试过Flask-Migrate。

快速创建生产和测试环境非常方便。

但我认为它不如 Django-Migration 那么方便。

当我尝试创建多对多数据模型时。 我有时会遇到以下错误:

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)

每当我在产品环境中运行'python app.py db upgrade'时,我都害怕将其分解。

有人告诉我,我应该通过手动SQL来改变表格。

我现在很困惑,我想以方便的方式做,我曾经在django-migration中做过。

假设我已经在产品环境中创建了数据库和表,是否仍然需要执行create_all或'python app.py db upgrade'(在Flask-Migrate中)?

如何在Flask-Migrate中的列上添加评论?

2 个答案:

答案 0 :(得分:1)

在现有数据库中,在生产环境中,您显然不希望重新创建数据库模式并丢失任何现有数据。查看数据库迁移,以下是相关的包:

答案 1 :(得分:0)

我真的不知道你想要什么!! 我认为flask Migrate是一个很好的工具,但它有一些限制,因为它在this中显示,因为alembic没有检测到你必须通过在使用它们时添加外键名称来编辑迁移脚本的每次迁移,就像在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时给它所有参数specialy name 但总的来说,这是因为您需要命名外键而不使用默认名称