Python 在Flask SQLAlchemy中,我应该使用create_all()在生产环境中创建表吗?
我对烧瓶不熟悉。 我正在研究烧瓶炼金术,我也尝试过烧瓶迁移 快速创建生产和测试环境非常方便 但我认为它不像Django迁移那样方便 当我试图创建多对多数据模型时。 我有时会犯以下错误: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
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()
并在定义外键时为其指定所有参数的名称
但一般来说,这是因为您需要命名外键,而不使用默认名称我应该使用它吗?