繁体   English   中英

工厂男孩到 select 从现有的 flask_sqlalchemy 表与迭代器使用参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM