使用烧瓶时从工厂男孩中的 table 中选择

Choosing from a populated table in factory boy while using flask

在 factory boy 中,可以创建一个与另一个对象有关系的 sqlalchemy 对象 table。 Choosing from a populated table 有一个为 django 制作的通用配方,我现在想为 flask 做这个。

所以我认为我用过这条线。

user = factory.Iterator(User.query.all())

但是当然不行。我得到一个没有应用程序上下文的错误。它在文档中指出,在第一次调用 Userfactory 之前不会评估查询,但是在导入时会发生错误。

我想要一个从我已经创建的对象中选择外键的工厂。我怎样才能在烧瓶中做到这一点?

该示例适用于 Django,因为 QuerySet 是惰性的;即请求仅在尝试对其进行迭代时命中数据库。 FactoryBoy 的迭代器只会在第一次调用工厂时开始迭代提供的生成器。

对于 SQLAlchemy,您需要一种方法来 return 生成器而不是列表;我认为这适用于 factory.Iterator(User.query)User.query.all() 显式发送 SQL 请求并检索结果, 在正确配置应用程序之前失败。

如果这不起作用(SQLAlchemy 文档对 Query 迭代行为不是很清楚),您可以尝试使用辅助函数:

def lazy_users():
  """Turn `User.query.all()` into a lazily evaluated generator"""
  yield from User.query.all()

class ProfileFactory(...):
  user = factory.Iterator(lazy_users())