首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行Flask-Migrate时保留数据库中的现有表

运行Flask-Migrate时保留数据库中的现有表
EN

Stack Overflow用户
提问于 2016-08-21 02:45:40
回答 2查看 3.1K关注 0票数 5

我有一个包含现有表的数据库。我的代码有一个User模型。我使用Flask-Migrate生成了一个修订版并运行了它,它在创建用户表时删除了我现有的表。如何在不删除现有表的情况下运行迁移?

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2016-08-21 23:43:37

如果您的数据库中已有表,但代码中没有相应的模型,则Alembic (Flask-Migrate)只知道您的数据库和代码之间存在差异。它不能知道(默认情况下)您打算让这些表保持不变。

include_object函数传递给环境,以影响Alembic将为其生成命令的数据库对象。下面的示例跳过列出的表名称,但允许所有其他表名称。

代码语言:javascript
复制
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
)
票数 13
EN

Stack Overflow用户

发布于 2021-07-22 23:03:39

这个问题还有另一个解决方案,它是这样的:

Alembic在target_metadata参数中查找表,该参数也接受对象列表,因此我们可以从celery传递这些模型。

我们所需要做的就是改变:

file - env.py

从…

代码语言:javascript
复制
target_metadata = current_app.extensions["migrate"].db.metadata

代码语言:javascript
复制
from celery_sqlalchemy_scheduler.models import ModelBase

...

target_metadata = [current_app.extensions["migrate"].db.metadata, ModelBase.metadata]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39057587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档