我的测试套件出现问题。
我正在使用带有鼻子测试,SQLAlchemy,Flask和Factory-Boy的设置

我有以下代码:

def _create_fixtures(self):
    self.user = UserFactory()
    pprint(db.query(User).all())
    db.add(self.user)
    pprint(db.query(User).all())


女巫返回以下内容:

[<User #1>, <User #2>]
[<User #1>, <User #2>]


我的UserFactory看起来像这样:

class UserFactory(Factory):
    FACTORY_FOR = User
    FACTORY_SESSION = db
    email = Sequence(lambda n: 'user{0}@wohnortfinder.com'.format(n))
    password = "password"
    username = Sequence(lambda n: 'user{0}'.format(n))


(是的,我使用的是普通工厂,而不是SQLAlchemy工厂,因为这也不起作用)

为什么我的工厂对象没有存储到数据库?它不会引发错误,只是无法保存。
我的意思是,即使当前事务尚未提交,以后的查询也应该查询实际事务,不是吗?

奇怪的是,当我手动提交会话时,会引发错误。

InvalidRequestError: No transaction is begun.


即使我在创建会话对象时开始了事务。

def init_engine(uri, **kwargs):
    global engine
    engine = create_engine(uri, **kwargs)
    Base.metadata.create_all(engine)
    db.begin()
    return engine


engine = None

db = scoped_session(lambda: create_session(bind=engine))


知道为什么这不起作用吗?

谢谢你的想法

最佳答案

您可以在不设置SQLAlchemy会话的情况下定义factory_boy工厂,然后通过分配factory类的_meta属性在初始化Flask应用程序和使用工厂之间进行设置:

db_session = set_up_a_db_session_somehow()
MyFactoryClass._meta.sqlalchemy_session = db_session


这似乎适用于有范围的会话。

关于sqlalchemy - 如何正确使用带有SQLAlchemy session (延迟加载)的Factory Boy?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22887897/

10-09 17:39
查看更多