Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Flask SQLAlchemy中,我应该使用create_all()在生产环境中创建表吗?_Python_Flask_Flask Sqlalchemy - Fatal编程技术网

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

Python 在Flask SQLAlchemy中,我应该使用create_all()在生产环境中创建表吗?,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我对烧瓶不熟悉。 我正在研究烧瓶炼金术,我也尝试过烧瓶迁移 快速创建生产和测试环境非常方便 但我认为它不像Django迁移那样方便 当我试图创建多对多数据模型时。 我有时会犯以下错误: sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u' CREATE TABLE ad_accounts ( acc

我对烧瓶不熟悉。 我正在研究烧瓶炼金术,我也尝试过烧瓶迁移

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

但我认为它不像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)
每当我在产品环境中运行“python app.py db upgrade”时,我都害怕把它弄坏

有人告诉我应该用手工SQL修改表

我现在很困惑,我想用一种方便的方式来做,我以前在django迁移中做过

假设我已经在product Environment中创建了数据库和表,那么我还需要执行create_all或“python app.py db upgrade”(在迁移中)吗



以及如何在Flask Migrate中的列上添加注释?

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

  • (内部使用)

    • 我不确定我是否得到了你想要的东西。 我认为flask Migrate是一个很好的工具,但正如前面所述,它有一些局限性

      基本上,由于alembic没有检测到每一次迁移,您必须按照alembic文档中的说明,在使用外键名称时添加外键名称来编辑迁移脚本 . 我在迁移过程中遇到了同样的问题,我通过手动添加外键名称来编辑文件夹“/migration/version”中的迁移脚本,从而解决了这个问题!用这行代码

      sa.ForeignKeyConstraint(['access_token_id'], ['fb_access_token.id'],use_alter=True, name='fk_fb_access_token.id_id' ),
      
      或者,如果您不想编辑迁移脚本,可以使用该对象

      ForeignKeyConstraint
      
      而不是

      db.ForeignKey()
      
      并在定义外键时为其指定所有参数的名称


      但一般来说,这是因为您需要命名外键,而不使用默认名称

      我应该使用它吗?