告诉FlaskMigrate/Alembic不要丢弃它不知道的任何表

2024-04-24 14:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据库,其中包含Python代码未使用的现有表。我使用Flask Migrate生成了一个迁移并运行它,它在创建用户表时删除了我现有的表。如何在不删除任何现有表的情况下运行迁移?在

我阅读了问题“Preserve existing tables in database when running Flask-Migrate”的答案,但它对我不起作用,因为我不拥有数据库,而且我不知道在部署时可能存在哪些表。。。这意味着我不能列出应该保留的表。在

Is there a way to tell Flask-migrate/Alembic not to drop any tables that it doesn't know about?

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()

Tags: tonamefromimport数据库appflaskdb
1条回答
网友
1楼 · 发布于 2024-04-24 14:11:45

您可以使用^{}并在删除前进行自动检查。 重写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_directiveskwarg。(见文件)

相关问题 更多 >