与 db.create_all() SQLAlchemy Python3.6 相关的问题

Issue related with db.create_all() SQLAlchemy Python3.6

为了总结我的问题,我尝试使用 SQLAlchemy 命令 db.create_all() 生成我的 PostgreSQL 数据库 tables,它 returns 出现以下错误:

RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

我当然遵循了该平台上的文档和线程并尝试了不同的替代方案:

from app import db, create_app
db.create_all()

此方法仍然失败并显示相同的消息。另一种方法是将 create_app 函数包含在 create_all() 函数中,以便它具有正确的上下文。

db.create_all(app=create_app())

这产生了一个新的错误,因为在执行create_app()函数时,它需要环境变量(我不知道如何通过python终端包含变量)。

    db.init_app(app)
with app.app_context():
    db.create_all()
migrate.init_app(app, db)
mail.init_app(app) 

这次执行的结果是空的。数据库内部绝对没有发生任何事情,我 100% 确定我的 运行 和我的数据库之间存在连接,但没有 table 或生成任何类型的错误。

在所有替代方案中,我认为最合理的是 运行 通过 python 终端创建,但是,当我 运行 我的应用程序,但它无法帮助我从终端初始化数据库。

有人能给我一些提示或帮助吗?

向所有对此话题感兴趣的人致以问候,并特别感谢 mechanical_meat 的支持和帮助。

我学到了很多关于 python 应用程序以及我的应用程序失败的原因。首先,我认为要理解解决方案,我有必要评论我的项目结构:

├── entrypoint.py
├── config
├── app
│   ├── __init__.py
│   │   └── models.py
│   ├── module 1
│   │   └── models.py
│   ├── module 2
│   ├── module N
│   │   └── models.py

如果我需要启动我的应用程序,我激活了我的虚拟环境并添加了必要的环境变量(FLASK_ENV、FLASK_APP 或 APP_SETTINGS_MODULE)。

此时,如果我尝试 运行 db.create_all(),我会从该线程收到错误消息,即应用程序上下文不存在,因为我的入口点中仅存在以下几行:

from flask import send_from_directory
import os
from app import create_app

settings_module = os.getenv('APP_SETTINGS_MODULE')
app = create_app(settings_module)

if __name__ == '__main__':
    app.run(debug=True)

我在这种情况下的解决方案很愚蠢。我唯一做的就是在与入口点相同的高度创建两个 python 文件。第一个包含类似于我的应用程序生成器的信息,但不同之处在于其中的所有变量都使用配置进行了初始化(从安全的角度来看,这是一种糟糕的方法):

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = 'SECRET'
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:...'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

login_manager = LoginManager(app)
login_manager.login_view = "login"
db = SQLAlchemy(app)

from models_db import User, Task, History

另一个文件包含 classes 的声明以正确加载列。并且,使用此解决方案,数据库表的生成工作正常,唯一的额外更改是将环境变量从 app 更改为我负责创建数据库的新 class。这是必要的,因为我的目标是它可以包含在 dockerfile 中并自动创建表。

再次感谢所有费心阅读此帖的各位,如果谁有更优雅的解决方案,我将很乐意深入分析。如果这可以帮助其他人找到解决方案,那就太好了。