【问题标题】:db.create_all not creating tables in pytest-flaskdb.create_all 不在 pytest-flask 中创建表
【发布时间】:2021-07-07 14:45:16
【问题描述】:

我正在为遇到此问题的任何人自行记录db.create_all 的解决方案。希望它会对某人有所帮助。

以下是对我没有帮助的其他线程列表:

我尝试在 pytest 的 conftest.py 中创建和销毁 db。 Alembic autogenerate 对我有用,但由于某种原因 db.create_all 不是。在db.create_all 之前导入模型什么也没做。在我的__init__.py 中也没有在db = SQLAlchemy() 之后导入模型(我使用的是应用程序工厂模式)。我也在使用声明式基础,这可能是问题的一部分。

每次运行 pytest 都会导致以下错误:

ERROR tests/test_main.py::test_index - sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "rule" does not exist

【问题讨论】:

    标签: python flask sqlalchemy pytest flask-sqlalchemy


    【解决方案1】:

    解决方案是短路 Flask-SQLAlchemy 将 create_all 挂在 db 对象上的方法。

    我遵循了实际SQLA docs中的模式:

    Base.metadata.create_all(engine)
    

    所以在我的 conftest 设置和销毁中,而不是 db.create_all() 和 db.drop_all():

    @pytest.fixture
    def app():
        app = create_app(TestConfig)
    
        with app.app_context():
            from app.models import Access, Rule, Base
            Base.metadata.drop_all(db.engine)
            Base.metadata.create_all(db.engine)
            print("Creating all")
            main(app)
    
        yield app
    
        with app.app_context():
            db.session.remove()
            Base.metadata.drop_all(db.engine)
            print("Dropping all")
    

    这解决了问题。测试现在通过,表被创建和销毁。

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2021-11-12
      • 2013-10-19
      相关资源
      最近更新 更多