使用db.create_all

时间:2018-10-09 00:13:27

标签: 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()

我的模型继承自我从db.Model继承的BaseModel,其中db是我在route.py中定义的db的导入。

我在这里做错了什么?如何使flask-sqlalchemy自动为我创建表?我在吠错树吗?

1 个答案:

答案 0 :(得分:0)

我建议在第一个请求之前不要进行数据库设置和拆除。它实际上会等待第一个请求,并在处理该请求之前,触发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