[英]Tell Flask-Migrate / Alembic to NOT drop any tables it doesn't know about
我有一个数据库,其中包含我的 Python 代码未使用的现有表。 我使用 Flask-Migrate 生成了一个迁移并运行它,它在创建用户表时删除了我现有的表。 如何在不删除任何现有表的情况下运行迁移?
我阅读了“ 运行 Flask-Migrate 时在数据库中保留现有表”问题的答案,但它对我不起作用,因为我不拥有数据库,而且我不知道部署时可能存在哪些表...这意味着我不能将应保留的表列入白名单。
有没有办法告诉 Flask-migrate/Alembic 不要删除它不知道的任何表?
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()
你只需要这个:
# in env.py
def include_object(object, name, type_, reflected, compare_to):
if type_ == "table" and reflected and compare_to is None:
return False
else:
return True
context.configure(
# ...
include_object = include_object
有关文档,请参见此处: https : //alembic.sqlalchemy.org/en/latest/cookbook.html#don-t-generate-any-drop-table-directives-with-autogenerate
您可以使用Rewriter
并在删除前进行自动检查。 覆盖ops.DropTableOp
操作。
如果需要,您还可以输入一个条款以仅删除您可以控制的表。 这些将是从您的Base
(在纯 alembic 的情况下)或db.Model
(对于烧瓶)继承的那些。
例子
from alembic.autogenerate import rewriter
from alembic.operations import ops
writer = rewriter.Rewriter()
@writer.rewrites(ops.DropTableOp)
def add_column(context, revision, op):
if op.table_name in Base.metadata.tables.keys():
return op # only return an operation when you want
return [] # we need to return an iterable
请注意,在env.py
文件中执行context.configure
时,您需要将writer
对象传递给process_revision_directives
kwarg。 (见文档)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.