【问题标题】:How to use Factory Boy with SQLAlchemy session (Lazy Loaded) correctly?如何正确使用带有 SQLAlchemy 会话(延迟加载)的 Factory Boy?
【发布时间】:2014-04-05 22:52:19
【问题描述】:

我的测试套件出现了问题。 我正在使用带有鼻子测试、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 flask nosetests factory-boy


    【解决方案1】:

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

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

    这似乎适用于范围会话。

    【讨论】:

      【解决方案2】:

      好的,我现在看到了我的一个错误。我创建了一个范围会话。相反,我应该为我的应用程序使用普通会话。这里的问题是 - 我怎样才能懒惰地初始化一个正常的会话?

      我会在另一个问题中讨论这个问题

      对于范围会议,我找到了这个特定问题的答案。 问题是,在作用域会话中,我的整个应用程序将无法运行,但测试将..

      此代码适用于范围会话,针对此问题。

      def _create_fixtures(self):
          db.begin()
          self.user = UserFactory()
          db.add(self.user)
          db.commit()
      

      【讨论】:

        猜你喜欢
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        相关资源
        最近更新 更多