Ecto 数据库操作与变更集的深入解析
1. 关联记录的处理
在处理关联记录时,父记录和子记录的操作紧密相关。不同数据库对于此功能的实现方式有所不同。例如,在 PostgreSQL 中,Ecto 使用 jsonb 列类型将记录存储为键值对数组;而在 MySQL 中,Ecto 会将记录转换为 JSON 字符串并以文本形式存储。不过,最终结果是相同的:嵌入式记录会被加载到相应的 Elixir 结构体中,并且可以在单个查询中获取,无需调用 preload。
当删除带有关联的父记录时,需要考虑子记录的处理方式。Ecto 提供了 on_delete: 选项来指定所需的行为,该选项有以下三种值:
- :nothing :这是默认行为,当父记录被删除时,Ecto 不会对其子记录进行任何操作。
- :nilify_all :Ecto 会更新所有子记录,将引用父记录的外键设置为 null,此时子记录不再与任何父记录关联。
- :delete_all :Ecto 会将所有子记录与父记录一起删除。
需要注意的是,许多数据库(如 Postgres)允许在创建表时在数据库本身指定此行为。在这种情况下,删除或置空(nilify)子记录的工作将由数据库处理,而不是 Ecto。因此,如果数据库支持此功能,需要在数据库迁移中使用 on_delete ,而不是在声明关联时使用。
以下是一个简单的表格总结:
| on_delete 值 | 说明 |
| ---- | --
超级会员免费看
订阅专栏 解锁全文
60

被折叠的 条评论
为什么被折叠?



