如何同时插入 2 个对象但相差 1 秒?

How to insert 2 objects at the same time but with a difference of 1 second?

在某些情况下,我需要通过 Ecto 将同一个结构的 2 个对象插入到数据库中,这样 其中一个结构的 inserted_atupdated_at 应该只与另一个相差 1 秒。

我依次插入 2 个结构对象,一个接一个,结果它们的 inserted_atupdated_at 是相同的。而我希望第二个对象的 inserted_atupdated_at 比第一个对象大 1 秒,这样稍后当我从数据库中检索它们并显示在页面上时,数据会更有意义.

向第二个对象的 changeset 结构提供 inserted_atupdated_at + 1 秒没有帮助,因为它们被 Ecto 忽略了,并且两个对象都相同 inserted_atupdated_at 值。

insert 的调用之间调用 :os.sleep(1000) 将是一个糟糕的选择。

我该怎么做?

人们可能会使用 Ecto.Repo.insert_all/3 来达到这个目的。根据文档:

If the schema contains an autogenerated ID field, it will be handled either at the adapter or the storage layer. However any other autogenerated value, like timestamps, won't be autogenerated when using insert_all/3.

也就是说,应该使用 DateTime.utc_now/0 为两个变更集显式设置 inserted_atupdated_at 值,然后调用 update_all/3.

注意! 如果您的记录有其他由 Ecto 计算的字段,所有这些也应该明确设置。


另一种选择是插入两者然后更改第二个,但这肯定更糟,因为它需要 3 个查询而不是上述方法中的一个。