EdgeDB 数据插入操作完全指南

EdgeDB 数据插入操作完全指南

edgedb A graph-relational database with declarative schema, built-in migration system, and a next-generation query language edgedb 项目地址: https://gitcode.com/gh_mirrors/ed/edgedb

前言

EdgeDB 作为新一代的关系型数据库,提供了强大而灵活的数据插入功能。本文将深入探讨 EdgeDB 中的各种数据插入技巧,帮助开发者高效地管理数据库操作。

基础数据插入

最基本的插入操作是创建一个新的对象实例。以下是一个插入电影记录的示例:

insert Movie {
    title := 'Dune',
    year := 2020,
    image := 'dune2020.jpg',
    directors := (
        select Person
        filter
            .full_name = 'Denis Villeneuve'
    )
}

这个例子展示了如何:

  1. 创建新的 Movie 对象
  2. 设置标量属性(title, year, image)
  3. 通过查询关联已存在的 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
}

这种模式实现了:

  1. 尝试插入新用户
  2. 如果用户已存在,则更新该用户的头像
  3. 最后返回用户信息(无论新插入还是更新)

嵌套结构中的智能插入

结合冲突处理,可以在复杂插入中智能处理关联对象:

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
    )
}

这种模式特别适合:

  • 评论系统:用户可能已存在或需要新建
  • 确保数据完整性:不会重复创建用户
  • 简化业务逻辑:单次操作完成所有工作

最佳实践建议

  1. 明确冲突处理:总是为可能产生冲突的插入操作添加 unless conflict 子句
  2. 使用类型安全:处理 JSON 输入时,明确指定类型转换
  3. 原子操作:利用嵌套插入保持数据一致性
  4. 查询优化:对单链接使用 limit 1 提高效率
  5. 结果返回:考虑使用 select 包装插入操作以获取结果

通过掌握这些 EdgeDB 插入技术,开发者可以构建出既高效又可靠的数据层操作。

edgedb A graph-relational database with declarative schema, built-in migration system, and a next-generation query language edgedb 项目地址: https://gitcode.com/gh_mirrors/ed/edgedb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢郁勇Alda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值