ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EdgeDB(Gel)DELETE 语句实战指南:从 Cheatsheet 出发掌握数据删除的两种范式

EdgeDB(Gel)DELETE 语句实战指南:从 Cheatsheet 出发掌握数据删除的两种范式 EdgeDBGelDELETE 语句实战指南从 Cheatsheet 出发掌握数据删除的两种范式【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址: https://gitcode.com/gh_mirrors/ed/edgedb本文基于 EdgeDB 官方 Cheatsheet 中的 Deleting data 一页展开系统讲解在 EdgeDBGel中删除对象的两种核心写法直接对类型集做filter删除以及通过反向链接backlink定位并删除。读完本文你将掌握delete语句的完整语法、filter/order by/offset/limit子句的语义、删除返回值的使用方式以及链接删除策略link deletion policy与级联删除的底层机制并能直接把这些模式应用到自己的 schema 中。从 Cheatsheet 说起两种删除范式原 Cheatsheetdocs/resources/cheatsheets/delete.rst以一组电影评论User、Movie、Reviewschema 为背景给出了两种删除某个用户所有评论的写法。其中用到的对象类型定义在 docs/resources/cheatsheets/objects.rst要点如下type User extending HasImage { required name: str { constraint exclusive; } } type Review { required body: str; required rating: int64 { constraint min_value(0); constraint max_value(5); } required flag: bool { default : False; } required author: User; required movie: Movie; required creation_time: datetime { default : datetime_current(); } }注意Review.author是required author: User即每条评论都有一条指向作者的多对一链接反之从User出发可以通过反向链接.author[is Review]找到该用户写过的全部评论。范式一直接按链接路径过滤删除第一种写法直接指定要删除的类型并通过链接路径过滤delete Review filter .author.name trouble2020要点在于filter子句里的路径表达式.author.nameEdgeQL 会自动沿Review - author - User.name解析筛出所有作者名为trouble2020的Review对象并删除。这符合直觉也是日常最常用的方式。范式二通过反向链接backlink删除Cheatsheet 给出的另一种方式利用了反向链接遍历delete ( select User filter .name troll2020 ).author[is Review]逐步拆解select User filter .name troll2020先找出目标用户.author[is Review]对该用户沿author链接的反方向做一次类型过滤遍历得到指向该用户的所有Review整个括号表达式是一个对象集合delete直接作用于这个集合。这里的[is Review]是类型过滤type filter保证反向遍历只保留Review类型避免把其它也指向该User的对象误纳入删除范围。这种写法在从一个对象出发删除其所有关联对象的场景中非常自然也常与update语句中的-一起用于先解除链接再删除的模式见下文链接删除策略。DELETE 语句的完整语法与语义Cheatsheet 只是速查完整的语句形式定义在 docs/reference/reference/edgeql/delete.rst[ with with-item [, ...] ] delete expr [ filter filter-expr ] [ order by order-expr [direction] [then ...] ] [ offset offset-expr ] [ limit limit-expr ] ;几个关键语义点with子句既可以声明模块别名也可以声明表达式别名供delete语句内部引用详见 docs/reference/edgeql/with.rst。整个delete expr ...语句是delete (select ...)的语法糖expr、filter、order by、offset、limit共同决定要删除的集合其成型方式与显式select完全一致。这解释了为什么 Cheatsheet 范式二能直接delete (select User ...).author[is Review]——括号里是一个合法的集合表达式。语句执行成功后返回被删除对象的集合。在 docs/reference/edgeql/delete.rst 中可以看到带全部子句的完整示例delete Hero filter .name ilike the % order by .name offset 10 limit 5;该示例先按名字模糊过滤再排序、跳过前 10 条、最多删除 5 条——相当于一次分批清理。删除与 select 的等价关系源码佐证delete即delete (select ...)的语法糖这一点在仓库测试 tests/test_edgeql_delete.py 的test_edgeql_delete_sugar_01第 378 行起中有直接验证DELETE DeleteTest FILTER .name[-1] ! 2 ORDER BY .name OFFSET 2 LIMIT 2; # should delete 4 and 5测试先插入 6 条名为sugar delete 1到sugar delete 6的记录然后执行带filter/order by/offset/limit的删除最后断言只剩sugar delete 1、sugar delete 2、sugar delete 3、sugar delete 6——即OFFSET 2 LIMIT 2精准删掉了排序后的第 4、5 条。这说明排序与分页子句确实作用于被删除集合的成型过程与select行为一致。同文件中还有test_edgeql_delete_returning_01到_05、test_edgeql_delete_union、test_edgeql_delete_multi_simultaneous_01等用例覆盖了删除返回值、并集删除、多对象同时删除等场景是深入学习delete行为的第一手材料。删除返回值数据永久消失前的最后一刻delete返回被删除对象的集合你可以把它继续交给select在数据被永久删除前取出其属性与链接with movie : (delete Movie filter .title Untitled) select movie {id, title};正如 docs/reference/edgeql/delete.rst 中所强调这是该数据在永久删除前最后一次可用的时机。常见的实用模式包括删除前把对象快照归档到审计表、统计本次删除了多少条、或把被删对象的 id 记录下来用于后续补偿逻辑。测试文件中的test_edgeql_delete_returning_*系列用例如test_edgeql_delete_returning_01tests/test_edgeql_delete.py 第 179 行专门验证了这种删除后立即 select的返回行为。链接删除策略为什么删除会被拒绝默认情况下你不能删除一个仍被其它对象链接引用的对象。例如db delete Hero filter .name Yelena Belova; ConstraintViolationError: deletion of default::Hero (af7076e0-3e98-11ec-abb3-b3435bbe7c7e) is prohibited by link target policy {}这个报错发生的原因是 Yelena 仍出现在《黑寡妇》电影的characters链接列表中。必须先解除这条链接再执行删除update Movie filter .title Black Widow set { characters - (select Hero filter .name Yelena Belova) }; delete Hero filter .name Yelena Belova;这与 Cheatsheet 范式二先取出反向链接集合再删除的思路互为补充范式二是直接对反向链接集合执行删除而这里先用-把链接从源对象上移除再删除目标对象。如果业务上允许删目标时自动断开链接可以在 schema 中把链接的删除策略改为on target delete allowtype Movie { required title: str { constraint exclusive }; required release_year: int64; multi characters: Person { on target delete allow; }; }删除策略的完整清单见 docs/reference/datamodel/links.rstref_datamodel_link_deletion一节。级联删除delete source 与 delete target链接的删除策略不仅限于禁止/放行默认策略禁止删除仍被引用的目标对象上述报错即源于此on target delete allow允许删除目标对象链接随之消失on target delete delete source删除目标对象时连带删除链接的源对象——这就是级联删除cascading delete的实现方式例如删除作者时同时删掉他写的所有评论on target delete restrict更加严格的限制。对应的还有on source delete相关策略。正如 docs/reference/edgeql/delete.rst 中的提醒级联删除能力强大使用时要格外谨慎一个delete可能波及一整条对象链。建议在投入生产前先在测试环境用delete的返回集合确认实际波及范围。总结与推荐阅读回到 Cheatsheet 的两行速查-- 范式一按链接路径过滤 delete Review filter .author.name trouble2020 -- 范式二反向链接 类型过滤 delete ( select User filter .name troll2020 ).author[is Review]两者结果等价但表达路径不同范式一从被删对象出发正向过滤范式二从根对象出发反向遍历。实际项目中前者适合按条件批量清理某类对象后者适合删除某对象的全部关联。如果希望进一步深入推荐按以下顺序阅读仓库内材料docs/resources/cheatsheets/objects.rst本文示例所用的User/Review/Movie完整 schema 定义docs/reference/edgeql/delete.rstdelete的全面行为说明链接删除策略、级联、返回值docs/reference/reference/edgeql/delete.rst语句的正式语法与delete (select ...)等价关系tests/test_edgeql_delete.py覆盖语法糖、返回值、并集删除、多对象同时删除等场景的测试用例是验证本文所有结论的最直接依据。【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址: https://gitcode.com/gh_mirrors/ed/edgedb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表