python - 让flask-sqlalchemy使用db.create_all从模型创建表

标签 python postgresql flask sqlalchemy

我有一个 Docker 设置,带有 Flask 应用程序和 Postgresql 后端。我希望能够根据 Flask-SqlAlchemy 中定义的模型在 Postgres 中创建所有表。目前这对我不起作用。

在我的应用程序 __init__.py 中,我使用配置文件创建我的应用程序。

from flask import Flask


def create_app():
    app = Flask(__name__)
    app.config.from_pyfile("config.py")
    app.config.from_pyfile("secrets.py")
    return app


app = create_app()


from app import routes

在我的routes.py中,我从应用程序创建数据库,然后在第一个请求之前设置它(导入我的模型):

from .models import User, Community, Post, Debate

...

db = SQLAlchemy(app)


@app.before_first_request
def setup():
    db.init_app(app)
    with app.app_context():
        db.metadata.drop_all(bind=db.engine)
        db.metadata.create_all(bind=db.engine)
        db.session.commit()

我的模型继承 self 创建的 BaseModel,它继承自 db.Model,其中 db 是我在 paths.py 中定义的数据库的导入。

我在这里做错了什么?如何让flask-sqlalchemy 自动为我创建表?我是不是找错树了?

最佳答案

我建议在第一个请求之前不要进行数据库设置和拆卸。它实际上会等待第一个请求,并在提供服务之前触发 before_first_request 处理程序。这将导致对您的服务的第一个请求挂起。

请考虑在 create_app 工厂中处理数据库设置。

from flask import Flask
from models import db  # Or wherever you have it

def create_app():
    app = Flask(__name__)
    app.config.from_pyfile("config.py")
    app.config.from_pyfile("secrets.py")

    # Database setup
    db.init_app(app)
    db.drop_all()  # This will delete everything
    db.create_all()  # This creates on the table schema
    return app


app = create_app()


from app import routes

关于python - 让flask-sqlalchemy使用db.create_all从模型创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711665/

相关文章:

python - 错误 : 1318 Incorrect number of arguments for PROCEDURE | Flask

angularjs - Python flask 和AngularJS与链接http post请求顺序

python - 类型错误 : fit() takes exactly 3 arguments (2 given) with sklearn and sklearn_pandas

python - 由于命令 os sys.path,Conda 环境使用不正确的模块

python - 已通过身份验证,但 user.is_authenticated 仍为 false

sql - 在单个参数中传递多个值

sql - 展平与数组的关系以针对每个数组条目发出一行

python - 我如何将 flask.url_for() 与 flask-restful 一起使用?

python - 列表可以包含的项目数是否有限制?

python - OpenERP 在父记录中创建记录时将值从父记录传递到子记录