【问题标题】:Getting flask-sqlalchemy to create tables from Models with db.create_all使用 db.create_all 让 flask-sqlalchemy 从模型创建表
【发布时间】:2019-03-13 16:18:19
【问题描述】:

我有一个 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()

我的模型继承自我创建的 BaseModel,该 BaseModel 继承自 db.Model,其中 db 是我在 routes.py 中定义的 db 的导入。

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

【问题讨论】:

    标签: python postgresql flask sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多