[英]Factory boy to select from existing flask_sqlalchemy table with Iterator using parameter
这里有很多很好的答案,但我找不到解决我问题的答案。
两个 SQLAlchemy 模型:日历和事务。 交易链接到日历 model:
class Calendar(Model):
calendar_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
cal_date = db.Column(db.Date, unique=True, nullable=False)
class Transactions(Model):
transaction_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
transaction_date = Column(db.Date, nullable=False)
transaction_calendar_id = reference_col('calendar', pk_name='calendar_id')
transaction_calendar = relationship('Calendar', backref=db.backref('transaction_dates'))
然后 Factory Boy 类生成 SQLAlchemy 对象:
class CalendarFactory(BaseFactory):
calendar_id = Sequence(lambda n: n)
cal_date = Sequence(lambda n: datetime.date(2021,1,1) + relativedelta(days=n))
class Meta:
model = Calendar
sqlalchemy_get_or_create = ('cal_date', )
class TransactionFactory(BaseFactory):
transaction_date = Sequence(lambda n: datetime.date(2022,1,1) + relativedelta(days=n))
transaction_calendar = SubFactory(CalendarFactory, cal_date=SelfAttribute('..transaction_date'))
class Meta:
model = Transactions
我遇到的问题是,当我的TransactionFactory
生成时,它会尝试生成一个 CalendarFactory object ,即使给定的 date 已经有一个,我收到以下错误:
(sqlite3.IntegrityError) UNIQUE constraint failed: calendar.cal_date
我尝试了许多策略,包括StaticFactory
,如避免与 factory_boy 工厂重复中所述
我现在尝试处理的解决方案在使用 flask 时从工厂男孩的填充表中进行选择中进行了描述
这是我正在尝试的,但它不起作用:
def lazy_calendar(cal_date):
"""Turn query into a lazily evaluated generator"""
yield from Calendar.query.filter_by(cal_date=cal_date).all()
class TransactionFactory(BaseFactory):
transaction_date = Sequence(lambda n: datetime.date(2022,1,1) + relativedelta(days=n))
transaction_calendar = LazyAttribute(lambda c: lazy_calendar(c.transaction_date))
问题:我可以使用参数调用 Factory Boy Iterator
,以便我可以用我想要的单个日期取回生成器吗?
还是我在这里完全吠错了树?
注意:这个问题只有在我通过 VS 代码测试功能同时运行单元测试时才会出现。 当我通过 pytest 依次运行测试时,一切正常。 但是如果可以的话,我想让多线程版本工作。
所以,没有回应,但经过一段时间后,我已经能够自己修复它。 正如在特定场景中经常发生的那样,我遵循了一条路径,最终陷入了一个过于复杂的结。 解决方案是从头开始,而且很简单。
关键错误是在CalendarFactory
object 中生成 id。 这允许创建具有相同cal_date
的多个Calendar
对象。
我停止使用StaticFactory
,嘿,很快。 全面的绿色蜱虫。
所以工作代码是:
class CalendarFactory(BaseFactory):
cal_date = Sequence(lambda n: datetime.date(2021,1,1) + relativedelta(days=n))
class Meta:
model = Calendar
sqlalchemy_get_or_create = ('cal_date', )
谢谢!
别客气。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.