在创建应用程序之前导入反射的 Flask-SQLAlchemy 模块

Import reflected Flask-SQLAlchemy Module before creating the app

This is a continuation of this .

由于我的 Flask 应用程序不应在我的数据库中写入任何内容,因此我设置了 Flask-SQLAlchemy 来反映我的数据库。这样,当我更改架构时,我不必更改模型:

# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    with app.app_context():
        db.Model.metadata.reflect(db.engine)
# app/models.py
from app import db

class Data(db.Model):
    __table__ = db.Model.metadata.tables['data']

但是现在,如果我必须在创建应用程序之前导入模型,我会 运行 进入错误,因为尚未设置元数据。这在测试时是一个问题,例如:

# test.py
import unittest
from app import create_app, db
from app.models import Data


class TestGUI(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.app = create_app()
# etc ...

app.models 导入时,这会在 __table__ = db.Model.metadata.tables['data'] 中抛出 KeyError: 'data',因为在 create_app() 函数为 运行 之前未正确设置元数据。

我确实找到了解决方案(感谢@snakecharmerb)。解决方法很简单,避免问题,不要在 运行 create_app() 之前导入 app.models。有点 hacky,所以当您有更好的解决方案时,请随时 post 回答。 我的测试文件现在看起来像这样:

# test.py
import unittest
from app import create_app, db
app = create_app()
from app.models import Data


class TestGUI(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.app = app
# etc ...