PRQL 的 from 数据源指定关系、别名与特殊标识符的完整指南【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址: https://gitcode.com/gh_mirrors/pr/prqlfrom是 PRQL 管道式查询的起点与基石——每个查询都必须由一个from语句来声明数据源编译器会据此构建主管道pipeline。本文基于官方参考文档结合 prqlc 编译器源码与集成测试系统讲解from的基本用法、别名赋值、特殊字符表名的反引号引用以及default_db.前缀规避标准库名称冲突的完整方案帮助你写出准确、可编译、可移植的 PRQL 查询。from的基本用法声明数据源from的作用只有一个指定一个数据源data source。在 PRQL 中数据源通常对应数据库中的一张表from artists在 prqlc 标准库 中from被定义为接受default_db.source表引用、返回该relation的转换函数let from func default_db.source relation - relation source可以看到from的参数被限定为default_db命名空间下的表引用relation类型返回值即该关系本身。这正是 PRQL 把数据源当作普通关系relation对待的体现——from之后可以无缝接上select、filter、derive等任何标准库转换。from是查询的必要起点从编译器实现看from不只是惯例而是强制要求。在 lowering.rs 中当存在用户声明但没有以from开头的管道时编译器会直接报错PRQL queries must begin with from A query must start with a from statement to define the main pipeline因此任何完整的 PRQL 查询都应以from定义主管道作为第一行这一点在 集成测试 中大量体现例如from tracks、from invoices、from genres等。使用别名赋值表达式数据源表名不一定要与后续引用完全一致可以用赋值表达式assign expression为表引入别名from e employees select e.first_name别名在管道后续步骤中作为表限定符使用能够消解列名歧义让查询更清晰。集成测试中同样广泛采用这一写法例如 group_sort.prql 中的from aalbums以及 invoice_totals.prql 中的from iinvoices——后续步骤通过i.前缀引用该表的列。需要说明的是这种别名的引用机制建立在 标识符与this/that查找规则 之上在join场景中this指当前关系、that指另一张表为from指定别名后管道内即可用该别名精确限定列来源。特殊字符与保留字反引号引用表名若包含空格或特殊字符需要用反引号backtick包裹from artist tracks这与 PRQL 的标识符规则一脉相承。标识符与关键字文档 明确规定标识符只能包含字母数字与下划线、不能以数字开头要使用其他字符就用反引号包围。编译到 SQL 时这些标识符会按目标方言的规则进行引用和转义。反引号引用同样适用于文件路径等非传统表名场景。在 read-files.md 中DuckDB 允许直接在FROM子句写文件名PRQL 中同样需要反引号from artists.parquet此外PRQL 的保留字如case、type、enum、func、module等也都可以用反引号当作列名或变量名使用例如case其完整列表见 keywords.md。与标准库函数重名default_db.前缀当表名恰好与标准库中的某个函数同名时直接写from group会让编译器把group解析成标准库函数而非表名。此时可用default_db.前缀显式指明表属于默认数据库default_db.group # in place of from group take 1官方文档也坦承这是一个略显笨拙的临时方案awkward workaround其原因是from函数的签名限定为default_db.source——前缀default_db.正是为了让表引用显式落在default_db命名空间内从而与std命名空间下的函数名区分开。这一点在标准库定义中可以得到印证转换函数全部位于std命名空间std.from与from等价而表引用则归属于default_db命名空间。在使用该语法时管道起点不再是以from开头的语句而是以default_db.table_name开头的表引用表达式后续步骤如take 1仍照常串联。若后续官方解决该问题对应 issue #3271这一写法可能会被更优雅的语法取代届时请以新版本文档为准。进阶多层级数据库与 Schema 前缀from还支持带 schema 与数据库名的完整限定标识符。根据 标识符与关键字文档可以写成from my_database.chinook.albums但需要注意tracks、public.tracks、my_database.public.tracks会被编译器视为彼此独立的表定义因此在同一查询中要避免混用不同层级的前缀以免产生意外行为。from在编译链路中的位置从源码结构看from的解析与处理贯穿 PRQL 编译链路的多个阶段词法/语法层from作为转换transform被识别。在 CLI 的语法高亮模块 highlight.rs 中from被列为高亮关键字。语义层经解析后管道必须在语义阶段以from或default_db.表引用起始否则 lowering.rs 报出E0001错误。SQL 生成层在 keywords.rs 中from被确认为各 SQL 方言Generic 等的保留关键字最终对应生成 SQL 的FROM子句。换言之你在 PRQL 中写的from最终会被编译器映射为 SQL 的FROM而整个查询管道则围绕该数据源逐级构建。总结from虽然语法简单却是 PRQL 每个查询的强制入口基础用法from table直接声明数据源from alias table引入别名供管道后续引用含空格或特殊字符的表名使用反引号table name与标准库函数重名的表名使用default_db.group显式限定支持database.schema.table多级限定但各层级写法被视为不同表。若希望进一步了解关系数据的其他来源可继续阅读 临时关系字面量数组 与 文件读取函数DuckDB关于prql target:等查询头配置可参考 Target 与版本。【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址: https://gitcode.com/gh_mirrors/pr/prql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
