我有一个包含现有表的数据库。我的代码有一个User
模型。我使用Flask-Migrate生成了一个修订并运行它,并在创建用户表时删除了我现有的表。如何在不删除现有表的情况下运行迁移?
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'my_data'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
if __name__ == '__main__':
manager.run()
答案 0 :(得分:5)
如果数据库中有现有表,并且代码中没有相应的模型,则Alembic(Flask-Migrate)只知道数据库和代码之间存在差异。它(默认情况下)无法知道您打算保持这些表格不受影响。
将include_object
函数传递给环境以实现Alembic将为其生成命令的数据库对象。以下示例跳过列出的表名,但允许其他所有内容。
def include_object(object, name, type_, reflected, compare_to):
if type_ == 'table' and name in ('table', 'names', 'to', 'skip'):
return False
return True
# in env.py
context.configure(
# ...
include_object=include_object
)
答案 1 :(得分:1)
这个问题还有另一个解决方案,它是这样的:
Alembic 在 target_metadata
参数中查找表,该参数也接受对象列表,因此我们可以从 celery 传递模型。
我们需要做的就是改变:
文件 - env.py
来自
target_metadata = current_app.extensions["migrate"].db.metadata
到
from celery_sqlalchemy_scheduler.models import ModelBase
...
target_metadata = [current_app.extensions["migrate"].db.metadata, ModelBase.metadata]