Flask-Migrate无法检测到表格。

6
我有以下项目结构: 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()

manage.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.

为什么Flask-Migrate与Alembic无法检测到模型,从而无法创建表格?以下是我尝试过的方法:
  • 删除数据库,从头开始
  • 在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))

啊哈。我认为这很可能是因为你在多个地方创建了db对象。最好使用实例化Flask扩展项目/init.py的方法,而不是在manage.py中使用它。 - wgwz
重要的是展示models.py文件,因为导入语句可以解释为什么它不起作用。 - wgwz
你可以只粘贴它的一部分。 - wgwz
  1. 传递 Manager create_app 而不是 app
  2. 查找 flask migrate init_app。
  3. 我很确定你有一个循环导入,但现在没有时间证明它是否正确!祝好运。
- wgwz
如果您想添加导入模型,请接受答案并感谢。 - Joe
显示剩余9条评论
2个回答

10
解决方法是在__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

0

我曾经遇到过同样的问题。解决方案与@joe的相当相似。

在路由文件中

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

在创建应用程序时,当添加api_user命名空间时,flask_migrate会检测到模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接