使用Ecto.Multi在同一事务中两次更新表

牙本质

考虑一种情况,您尝试对银行交易记录进行建模。交易具有金额,类型(贷记或借记),并且与帐户关联。

在添加新的银行交易的情况下,我可以这样做,并且效果很好:

Multi.new()
|> Multi.insert(:transaction, transaction_changeset)
|> Multi.update(:account, account_changeset)
|> Repo.transaction()

更新现有的银行交易涉及更多。这是因为用户不仅可以更改金额,还可以更改帐户。更新现有交易可能意味着除了将金额添加到当前帐户之外,还从先前的帐户中删除了该金额。我尝试了此操作,但是不确定如何表达我要使用的功能Ecto.Multi

Multi.new()
|> Multi.update(:transaction, transaction_changeset)
|> Multi.update(:account, previous_account_changeset)
|> Multi.update(:account, current_account_changeset)
|> Repo.transaction()

运行时错误:帐户已经是Ecto.Multi的成员:

希哈里亚尔

这里的问题是您:account两次使用密钥。文档中

Ecto.Multi使打包应在单个数据库事务中执行的操作成为可能,并提供了一种对已排队的操作进行自省的方法,而无需实际执行。每个操作都有一个唯一的名称,如果成功或失败,它将识别其结果。


您可以选择任何喜欢的名称,只要它是唯一的即可。只需将您的交易更改为:

Multi.new
|> Multi.update(:transaction, transaction_changeset)
|> Multi.update(:previous_account, previous_account_changeset)
|> Multi.update(:current_account, current_account_changeset)
|> Repo.transaction

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用group by查询同一张表中的同一列两次

在Java中对流使用同一列表两次

SQL-从同一表中两次选择行而不使用UNION

在同一活动中两次使用接口

无法使用Ecto.Multi更新记录

使用JPA在EJB的同一事务中连续删除和保留同一实体

使用Ecto.Multi重构Ecto事务以提高效率

使用ecto查询联接3个表

使用 Ecto 预填充 PostgreSQL 表的建议

在同一事务中同时使用 EntityManager 和 Spring Repository 时是否存在性能问题?

SQL查询,使用同一个表两次

两次使用同一张表时获取结果

在SQLAlchemy上使用别名将同一表联接两次

如何在WHERE子句中两次使用同一列表?

如何使用PXSelectJoinOrderBy联接同一张表两次

使用汇总功能在同一表上两次内部联接

使用两个WHERE条件从同一张表中两次选择一列SQL SERVER

使用Ecto一次插入多行。“未为#Ecto.Changeset实现协议Enumerable”

在选择中两次使用联接和使用同一表列的问题

我有一个存储过程,需要从同一张表中两次提取信息。如何使用相关名称?

如何在同一“调用堆栈”中两次使用宏列表?

Makefile-在同一行中两次使用相同的变量

如何在同一页面中两次使用 JQuery 函数?

使用 powershell 在同一管道中重命名项目两次

如何在同一个选择中两次使用函数结果

对同一模型使用 ASP-FOR 两次

使用同一列两次SELECT或JOIN

使用 Ecto.Query 查询带有 UUID 的表会给出 Ecto.Query.CastError

如何使用Spring JPA在同一事务中的不同数据库上维护多个sql查询