尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Gel `gel describe object` 命令全解析:数据库模式对象的即席内省指南

Gel `gel describe object` 命令全解析:数据库模式对象的即席内省指南 数据库图数据库关系型数据库【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址https://gitcode.com/gh_mirrors/ed/edgedb点击查看免费下载gel describe object是 GelEdgeDB命令行工具中面向单个命名模式对象schema object的即席内省命令其行为与 EdgeQL 的DESCRIBE OBJECT内省语句一一对应可在终端中直接输出对象类型、函数、标量类型等对象的 DDL、SDL 或人类可读文本定义。本文以 gel_describe_object.rst 为骨架结合 EdgeQL 语法参考、解析器与编译器源码及测试用例完整讲解该命令的语法、参数、输出格式、底层实现与实战用法读完即可熟练用它快速查看数据库中的任意模式对象。命令概览一行命令看清任意模式对象gel describe object是gel describe命令组见 index.rst中的成员官方定位是描述一个已命名的模式对象Describe a named schema object。其命令语法为gel describe object [options] name该命令在当前连接到的数据库上执行输出是 EdgeQLdescribe object name内省语句的终端等价物。也就是说无论你是在交互式 REPL 中执行 EdgeQL 语句还是在 shell 里调用 CLI两者走的是同一条模式内省路径。在edb/cli/__init__.py中可以看到本仓库的 Python CLI 入口最终通过os.execvpe(gel, args, os.environ)edb/cli/init.py直接切换到 Rust 实现的gel二进制因此describe系列命令的实际解析与执行由 CLI 完成并将目标定位参数透传给服务端的 EdgeQL 编译器。参数详解name要描述的模式对象名称name是必选位置参数表示要描述的 schema object 名称。该参数并不限定对象类别——使用describe object时会按名称匹配任意模块级module-level模式对象包括对象类型object type、标量类型scalar type、函数function、链接link、属性property、注解annotation、约束constraint等唯一不适用的是模块module以及无法仅凭名称唯一识别的全局对象如std库中的类型。名称可使用模块限定符例如gel describe object default::User gel describe object std::get_version若未指定模块则按当前连接的默认模块branch 用户解析。--verbose展示被省略的细节--verbose等价于执行 EdgeQL 的describe object ... as text verbose语句参考 describe.rst 中关于as text [verbose]的说明。默认的as text输出会省略继承等细节而verbose模式会额外展示注解annotations如annotation title : ...约束constraints如constraint exclusive、constraint max_value(10)以及继承自父类型、在普通模式下被隐藏的细节。连接选项命令跑在哪个数据库上describe命令在它所连接的数据库上运行连接目标的指定方式与 Gel CLI 全局连接选项一致详见 gel.rst。常用连接选项如下选项说明-I name, --instancename连接到指定的命名实例连接参数存储于gel_config_dir/credentials通常由gel instance create等命令创建--dsndsn使用 DSN 连接优先级高于除密码外的所有其他选项--credentials-file /path/to/file指定包含凭据的 JSON 文件路径-H hostname, --hosthostname服务器主机名默认取GEL_HOST环境变量-P port, --portportTCP 端口默认取GEL_PORT环境变量未设置时为5656-u username, --userusername连接用户名默认取GEL_USER环境变量或当前 OS 登录名-b branch-name, --branchbranch-name连接的 branch 名默认取GEL_BRANCH环境变量或用户名Gel 5.0 起以 branch 取代 database旧版本使用-d dbname, --databasedbname--password \| --no-password强制/禁止密码交互提示--password-from-stdin从标准输入第一行读取密码--tls-ca-file /path/to/cert用于校验服务器的证书自签名服务器证书或 CA 证书--tls-security modeTLS 安全模式default无自定义证书时解析为strict、strict、no_host_verification、insecure--wait-until-availablewait_time连接失败时持续重试至多wait_time如30s--connect-timeouttimeout连接超时时间超时后命令失败或在--wait-until-available下重试实际使用时最简单的形式是直接指定实例名gel -I my_instance describe object default::User gel --dsngel://user:passwordlocalhost:5656/mydb describe object default::User三种输出格式DDL、SDL 与人类可读文本gel describe object的输出源自 EdgeQLdescribe语句的三种格式见 describe.rst 的语法定义describe schema-type name [ as {ddl | sdl | text [ verbose ]} ]格式语义说明as ddl合法的 DDL 定义默认格式。生成的 DDL 是假定其他被引用对象均已存在前提下的完整有效定义可直接用于重建该对象as sdlSDL 定义生成同样完整有效的 SDL 定义适合放入 schema 迁移文件对比as text [verbose]人类可读定义类似 SDL但包含所有继承inherited细节verbose时再追加注解、约束等默认省略的信息CLI 侧gel describe object name默认即 DDL 格式--verbose则切换到as text verbose。实战示例从简单类型到被遮蔽的内建对象以 describe.rst 中的示例 schema 为例abstract type Named { required name: str { delegated constraint exclusive; } } type User extending Named { required email: str { annotation title : Contact email; } }在 REPL 中分别执行不同格式db describe object User; { create type default::User extending default::Named { create required single property email - std::str { create annotation std::title : Contact email; }; }; }as sdl输出同一对象的 SDL 形态db describe object User as sdl; { type default::User extending default::Named { required single property email - std::str { annotation std::title : Contact email; }; }; }as text则展开所有继承与隐式成员如id、__type__db describe object User as text; { type default::User extending default::Named { required single link __type__ - schema::Type { readonly : true; }; required single property email - std::str; required single property id - std::uuid { readonly : true; }; required single property name - std::str; }; }加上verbose后注解与约束被补全——注意name上的constraint std::exclusive正是从父类型Named委托delegated继承而来db describe object User as text verbose; { type default::User extending default::Named { required single link __type__ - schema::Type { readonly : true; }; required single property email - std::str { annotation std::title : Contact email; }; required single property id - std::uuid { readonly : true; constraint std::exclusive; }; required single property name - std::str { constraint std::exclusive; }; }; }遮蔽masked内建对象的告警describe还有一个实用特性当用户定义的对象遮蔽mask了标准库同名对象时会在输出末尾以注释形式列出被遮蔽的内建定义。例如在default模块中定义计算向量长度的len函数遮蔽了std::len的多个内建重载db describe function len as text; { function default::len(v: tuplestd::float64, std::float64) - std::float64 using (select (((v.0 ^ 2) (v.1 ^ 2)) ^ 0.5) ); # The following builtins are masked by the above: # function std::len(array: arrayanytype) - std::int64 { ... }; # function std::len(bytes: std::bytes) - std::int64 { ... }; # function std::len(str: std::str) - std::int64 { ... }; }这对于排查我明明定义了len为什么行为不对这类问题是极为直接的诊断手段。支持的 schema-type通配object与精确类型EdgeQL 的describe语句允许显式指定 schema-type 来限定匹配范围describe.rst 的 synopsis 中列出schema-type匹配范围object name任意模块级模式对象最通用不匹配模块annotation name仅注解constraint name仅约束function name仅函数link name仅链接module name仅模块property name仅属性scalar type name仅标量类型type name仅对象类型gel describe object name对应其中最通用的object形态——不限定类别按名称匹配任意对象适合先看看这个名字到底是什么的探索式场景当你确切知道对象类别时也可以在 CLI 中改用如gel describe function std::len、gel describe type default::User等更精确的形态。源码级原理describe是如何被解析与编译的语法层DESCRIBE OBJECT的产生式在 EdgeQL 解析器语法中edb/edgeql/parser/grammar/statements.pydescribe语句族包含多个产生式def reduce_DESCRIBE_SCHEMA(self, *kids): # DESCRIBE SCHEMA ... def reduce_DESCRIBE_CURRENT_DATABASE_CONFIG(...) # DESCRIBE CURRENT DATABASE CONFIG ... def reduce_DESCRIBE_CURRENT_BRANCH_CONFIG(...) # DESCRIBE CURRENT BRANCH CONFIG ... def reduce_DESCRIBE_INSTANCE_CONFIG(...) # DESCRIBE INSTANCE CONFIG ... def reduce_DESCRIBE_ROLES(...) # DESCRIBE ROLES ... def reduce_DESCRIBE_SchemaItem(self, *kids): # DESCRIBE schema-type name ... def reduce_DESCRIBE_OBJECT(self, *kids): # DESCRIBE OBJECT name ... def reduce_DESCRIBE_CURRENT_MIGRATION(...) # DESCRIBE CURRENT MIGRATION ...其中reduce_DESCRIBE_OBJECT第 261 行附近直接构造qlast.DescribeStmt(objectNodeName, ...)reduce_DESCRIBE_SchemaItem第 252 行附近则处理带 schema-type 限定的形态。输出语言DescribeLanguage.DDL / SDL / JSON / TEXT由DescribeFormat非终结符解析verbose作为附加选项随语句传递。编译层命名对象的查找、格式化与遮蔽处理compile_DescribeStmtedb/edgeql/compiler/stmt.py是核心实现其处理流程清晰地反映了 CLI 行为全局对象分支DESCRIBE SCHEMADDL/SDL、DESCRIBE ... CONFIGDDL、DESCRIBE ROLESDDL等分别走对应分支其中DESCRIBE SCHEMA AS SDL调用s_ddl.sdl_text_from_schema第 876 行。命名对象分支对于name形态编译器会若对象类为MODULE校验模块存在后直接纳入输出范围第 931-940 行否则同时在当前命名空间和std中搜索——代码注释明确说明这是为了避免默认模块中的对象遮蔽std同名对象第 956-966 行函数单独处理由于函数允许同名重载通过lookup_functions收集所有匹配重载第 981-991 行其他对象则经get_schema_object精确匹配第 995-1017 行。输出语言分发根据DDL / SDL / TEXT分别调用ddl_text_from_schema、sdl_text_from_schema、descriptive_text_from_schema第 1038-1044 行。一个关键细节在 1044-1045 行as text非 verbose模式会过滤掉 Link 和 Property 引用类这正是普通文本输出中链接/属性细节被省略的实现来源。遮蔽注释生成当默认模块中命中对象且std中也有同名对象时把std侧匹配项标记为 masked追加# The following builtins are masked by the above:注释并缩进输出第 1079-1092 行——与前述len示例完全吻合。最终结果封装为std::str类型常量返回第 1094-1103 行这也解释了为何describe的输出在查询中表现为字符串却不能作为普通表达式使用。测试佐证仓库测试对DESCRIBE命令有系统覆盖tests/test_schema.py 起Test the DESCRIBE command用例包括DESCRIBE TYPE Child AS SDL / AS TEXT / AS TEXT VERBOSE验证同一继承类型在三种格式下注解、索引、继承约束、隐式id/__type__成员的展示差异第 10458-10516 行DESCRIBE OBJECT int_t AS TEXT与AS TEXT VERBOSE验证标量类型在 verbose 下追加注解test::anno与约束std::max_value(15)第 10518-10531 行DESCRIBE FUNCTION sys::get_version AS SDL、DESCRIBE MODULE test、DESCRIBE OBJECT array_agg AS TEXT等覆盖函数、模块、内建函数的多类对象第 10533 行起另有DESCRIBE CURRENT MIGRATION AS JSON第 4040 行验证describe语法可被迁移流程复用。这些用例同时印证了默认as text隐藏注解/约束verbose补全as sdl聚焦显式定义。与gel describe schema的分工同组的 gel_describe_schema.rst 定义了gel describe schema二者分工清晰命令等价 EdgeQL输出对象gel describe object namedescribe object name单个命名模式对象DDL/SDL/textgel describe schemadescribe schema as sdl整个数据库的 SDL 描述单对象诊断用describe object查看某个类型/函数/约束的当前定义、排查遮蔽问题、对比 verbose 前后差异整体导出用describe schema获取全库 SDL可用于 schema 对比、文档生成或迁移基线注意完整 schema 描述仅支持as ddl/as sdldescribe.rst 明确Only theas ddloption is available for schema description。实践要点小结gel describe object是describe object内省语句的终端等价物默认输出 DDL是最可靠的对象现状快照记不清对象类别时直接describe object name由编译器在默认模块与std中自动解析函数重载会被全部列出需要查看继承来的约束、注解时加--verbose等价as text verbose普通as text会主动省略 Link/Property 引用类细节若输出中出现# The following builtins are masked by the above:注释说明你的用户定义遮蔽了std同名内建——这是定位命名冲突的黄金线索命令在连接目标的数据库上执行实例/DNS/凭据/分支等连接参数与全局 CLI 选项一致--help-connect可随时查看完整清单。无论是日常调试模式、审查迁移前后的 schema 差异还是给同事快速分享某个对象的权威定义gel describe object都是 Gel 命令行工具箱中最高效的内省入口。赞分享数据库图数据库关系型数据库【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址https://gitcode.com/gh_mirrors/ed/edgedb点击查看免费下载相关推荐Gel CLI 架构自省指南深入掌握 gel describe 命令族Gel CLI 架构自省指南深入掌握 gel describe 命令族 gel describe 是 Gel CLI本仓库即 Gel/EdgeDB 的开源实数据库图数据库关系型数据库Gel/EdgeDB gel database create 命令详解创建数据库及向 gel branch create 的迁移指南Gel/EdgeDB gel database create 命令详解创建数据库及向 gel branch create 的迁移指南 gel database数据库图数据库关系型数据库Gel CLI 命令详解gel database drop 删除数据库的完整指南与 gel branch drop 迁移方案Gel CLI 命令详解 gel database drop 删除数据库的完整指南与 gel branch drop 迁移方案 gel database dr数据库图数据库关系型数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表