EdgeDB 数据插入操作完全指南
前言
EdgeDB 作为新一代的关系型数据库,提供了强大而灵活的数据插入功能。本文将深入探讨 EdgeDB 中的各种数据插入技巧,帮助开发者高效地管理数据库操作。
基础数据插入
最基本的插入操作是创建一个新的对象实例。以下是一个插入电影记录的示例:
insert Movie {
title := 'Dune',
year := 2020,
image := 'dune2020.jpg',
directors := (
select Person
filter
.full_name = 'Denis Villeneuve'
)
}
这个例子展示了如何:
- 创建新的 Movie 对象
- 设置标量属性(title, year, image)
- 通过查询关联已存在的 Person 对象作为导演
使用 JSON 数据插入
EdgeDB 支持直接从 JSON 数据构造并插入对象,这在处理 API 请求时特别有用:
with
data := <tuple<
title: str,
year: int64,
image: str,
directors: array<str>,
actors: array<str>
>> <json>$input
insert Movie {
title := data.title,
year := data.year,
image := data.image,
directors := (
select Person
filter
.full_name in array_unpack(data.directors)
),
actors := (
select Person
filter
.full_name in array_unpack(data.actors)
)
}
关键点:
- 使用类型转换将 JSON 转换为 EdgeDB 理解的元组类型
array_unpack
函数将数组展开为多个值- 可以一次性处理多个关联对象的查询和设置
嵌套对象插入
EdgeDB 允许在单个操作中同时插入多个相关联的对象:
insert Review {
body := 'Dune is cool',
rating := 5,
movie := (
select Movie
filter
.title = 'Dune' and .year = 2020
limit 1
),
author := (
insert User {
name := 'dune_fan_2020',
image := 'default_avatar.jpg',
}
)
}
特点:
- 原子性操作:要么全部成功,要么全部失败
- 可以混合使用查询(select)和插入(insert)操作
- 对于单链接(single link)必须使用 limit 1 确保唯一性
冲突处理机制
EdgeDB 提供了优雅的冲突处理机制,避免重复插入:
基本冲突避免
insert User {
name := "Alice",
image := "default_avatar.jpg",
}
unless conflict
指定冲突检测字段
insert User {
name := "Alice",
image := "default_avatar.jpg",
}
unless conflict on .name
这些操作会:
- 尝试插入新记录
- 如果唯一性约束冲突(如用户名已存在),则跳过插入
- 可以明确指定检测冲突的字段
高级 Upsert 操作
EdgeDB 的 unless conflict else
语法支持完整的 upsert 模式:
select (
insert User {
name := "Alice",
image := "my_face.jpg",
}
unless conflict on .name
else (
update User
set {
image := "my_face.jpg"
}
)
) {
name,
image
}
这种模式实现了:
- 尝试插入新用户
- 如果用户已存在,则更新该用户的头像
- 最后返回用户信息(无论新插入还是更新)
嵌套结构中的智能插入
结合冲突处理,可以在复杂插入中智能处理关联对象:
insert Review {
body := 'Loved it!!!',
rating := 5,
movie := (
select Movie
filter .title = 'Dune' and .year = 2020
limit 1
),
author := (
insert User {
name := "dune_fan_2020",
image := "default_avatar.jpg",
}
unless conflict on .name
else User
)
}
这种模式特别适合:
- 评论系统:用户可能已存在或需要新建
- 确保数据完整性:不会重复创建用户
- 简化业务逻辑:单次操作完成所有工作
最佳实践建议
- 明确冲突处理:总是为可能产生冲突的插入操作添加
unless conflict
子句 - 使用类型安全:处理 JSON 输入时,明确指定类型转换
- 原子操作:利用嵌套插入保持数据一致性
- 查询优化:对单链接使用 limit 1 提高效率
- 结果返回:考虑使用 select 包装插入操作以获取结果
通过掌握这些 EdgeDB 插入技术,开发者可以构建出既高效又可靠的数据层操作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考