【问题标题】:Import reflected Flask-SQLAlchemy Module before creating the app在创建应用程序之前导入反射的 Flask-SQLAlchemy 模块
【发布时间】:2021-07-26 02:51:43
【问题描述】:

这是question的延续。

由于我的烧瓶应用程序不应该在我的数据库中写入任何内容,因此我设置了 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() 函数之前未正确设置元数据。

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy flask-testing


    【解决方案1】:

    我确实找到了解决方案(感谢@snakecharmerb)。解决方案只是为了避免该问题,在运行create_app() 之前不要导入app.models。有点hacky,所以当你有更好的解决方案时,也可以随意发布答案。 我的测试文件现在看起来像这样:

    # 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 ...
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多