【问题标题】:Flask-Migrate not detecting tablesFlask-Migrate 未检测到表
【发布时间】:2018-12-11 05:11:41
【问题描述】:

我的项目结构如下:

project/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

def create_app():
    app = Flask(__name__)
    app.config.from_object(os.environ['APP_SETTINGS'])

    db.init_app(app)
    migrate.init_app(app, db)

    return app

run.py

from project import create_app
app = create_app()

if __name__ == "__main__":
    app.run()

ma​​nage.py

from flask_script import Manager
from flask_migrate import MigrateCommand
from project.models import *
from project import create_app


manager = Manager(create_app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

然而,当我运行以下命令时,Flask-Migrate 没有检测到任何要添加的表。

python manage.py db init

哪些输出:

Creating directory $HOME/Project/migrations ... done
Creating directory $HOME/Project/migrations/versions ... done
Generating $HOME/Project/migrations/script.py.mako ... done
Generating $HOME/Project/migrations/env.py ... done
Generating $HOME/Project/migrations/README ... done
Generating $HOME/Project/migrations/alembic.ini ... done
Please edit configuration/connection/logging settings in
'$HOME/Project/migrations/alembic.ini' before proceeding.

python manage.py db migrate

仅输出:

INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.

为什么使用 Alembic 的 Flask-Migrate 没有检测到模型并因此无法创建表?这是我尝试过的:

  • 删除数据库,白手起家
  • 在 manage.py 文件中创建自定义 db 类,但未检测到这一点
  • 谷歌搜索这个问题的每个答案,发现很多类似的问题,但他们的解决方案都不适合我。

编辑:

这里是models.py文件的一个例子

from flask import current_app
from project import db
from flask_login import UserMixin

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

【问题讨论】:

  • 你的模型是什么样的?
  • @wgwz 我的 models.py 文件太大,无法分享整个内容,但我只包含了一个相关示例。这不是我的模型的问题,因为我可以在 shell 中成功使用 db.create_all()
  • 啊哈。我认为这很可能是因为您在多个地方创建了 db 对象。使用实例化烧瓶扩展 project/__init__.py 的方法会比在 manage.py 中更好。
  • id 猜测您正在覆盖 manage.py 中的数据库实例
  • 重要的是要显示 models.py bc 导入语句可以解释为什么它不起作用

标签: python postgresql flask flask-sqlalchemy flask-migrate


【解决方案1】:

解决方案是在 __init__.py 文件中导入模型,如下所示:

def create_app():
    app = Flask(__name__)
    app.config.from_object(os.environ['APP_SETTINGS'])

    from project import models

    db.init_app(app)
    migrate.init_app(app, db)

    return app

【讨论】:

    【解决方案2】:

    我有同样的问题。解决方案与@joe's 非常相似

    在路由文件中

    from models import User
    
    api_user = Namespace('user', description='user related operations')
    

    在项目/__init__.py中

    def create_app():
        app = Flask(__name__)
        app.config.from_object(os.environ['APP_SETTINGS'])
    
        from project import models
    
        db.init_app(app)
        migrate.init_app(app, db)
    
        blueprint = Blueprint('api', __name__, url_prefix=url_prefix)
        api = Api(blueprint, doc='/documentation')  # ,doc=False
    
        app.register_blueprint(blueprint)
        api.add_namespace(api_user)
    
    return app
    

    在 create_app flask_migrate 检测到的模型中添加 api_user 命名空间时

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 2020-09-26
      • 2014-12-21
      • 2019-01-17
      • 2015-07-20
      • 2023-02-02
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多