后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载PRQLPipelinedRelationalQueryLanguage读作 Prequel是一门面向数据转换的现代语言——简单、强大、基于管道pipeline的 SQL 替代品。web/book目录承载的 PRQL Language Book 既是官方语言教程也是完整参考手册与项目文档。本文以 web/book/README.md 为主线讲解书籍的组织结构、本地构建与实时预览流程并结合仓库源码剖析 PRQL 语言的核心语法与编译链路帮助读者快速上手 PRQL 并深入理解其技术实现。一、PRQL Language Book 是什么PRQL Language Book 是面向语言使用者的官方书籍language book。其定位决定了写作风格友好、易读至少对理解基础 SQL 的用户零门槛。这一点与 PRQL 的设计哲学一致——它是 SQL 的替代品自然希望 SQL 用户能平滑迁移。书籍的自我定位可以从 web/book/src/README.md 中看到PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement. Like SQL, its readable, explicit and declarative. Unlike SQL, it forms a logical pipeline of transformations, and supports abstractions such as variables and functions. It can be used with any database that uses SQL, since it compiles to SQL.这段话浓缩了 PRQL 的三个核心特性可读、明确、声明式readable, explicit and declarative——与 SQL 一致逻辑管道式变换a logical pipeline of transformations——这是与 SQL 最大的差异每一行都是对上一行结果的变换支持抽象variables and functions——变量与函数这是 SQL 所缺乏的编译为 SQLcompiles to SQL——因此可用于任何使用 SQL 的数据库。书籍由 mdBook 构建其元信息定义在 web/book/book.toml[book] description Modern language for transforming data — a simple, powerful, pipelined SQL replacement language en title PRQL language book [output.html] additional-css [comparison-table.css] additional-js [highlight-prql.js] git-repository-url https://github.com/PRQL/prql [preprocessor.prql] command cargo run --bin mdbook-prql [preprocessor.footnote]值得注意的两点additional-css [comparison-table.css]与additional-js [highlight-prql.js]分别是书籍内置的 PRQL↔SQL 对照表样式与 PRQL 代码高亮脚本见 web/book/comparison-table.css 与 web/book/highlight-prql.jspreprocessor.prql声明了一个自定义 mdBook 预处理器其命令为cargo run --bin mdbook-prql。这正是 PRQL 书籍最特别的地方书中的 PRQL 示例会在构建时被真实编译成 SQL并自动生成对照表。二、书籍的整体结构Tutorial / Reference / Project 三大部分书籍内容位于 web/book/src由SUMMARY.md组织导航。全书分为三个板块左侧导航栏可随时切换Tutorial教程—— 友好且易学的 PRQL 入门指南难度循序渐进只需基本编程概念即可因为文中大量与 SQL 对照了解 SQL 会有帮助但并非必需。Reference参考—— 关于 PRQL 语言的深入信息包括语言设计决策的论证以及语言各部分的正式规范。Project项目—— 关于项目本身、工具链与开发的一般性信息。2.1 Tutorial从关系、过滤到聚合根据 web/book/src/SUMMARY.md教程部分包含三章Relations —— 关系表的基本概念Filtering —— 过滤对应 SQL 的WHEREAggregation —— 聚合对应 SQL 的GROUP BY 聚合函数。章节数量虽少但每一章都是围绕管道式思维展开的核心能力训练是理解 PRQL 语法的第一步。2.2 Reference语法、标准库与规范Reference 板块内容最丰富涵盖语法Syntaxliterals字面量、strings字符串含 f-strings、r-strings、s-strings、tuples元组、arrays数组、identifiers keywords标识符与关键字、function calls函数调用、pipes管道、operators运算符、case、ranges区间、comments注释、parameters参数数据导入Importing datafrom、reading files读取文件、ad-hoc data / relation literals临时数据/关系字面量声明Declarationsvariableslet与into 与 functions标准库Standard librarytransforms 下细分了 aggregate、append、derive、filter、group、join、loop、select、sort、take、window另有 date、math、text、tuple 函数以及 distinct去重等规范Specificationnull handling空值处理、name resolution名称解析、modules模块、type system类型系统。2.3 Project项目、工具链与集成Project 板块面向项目层面的信息包括Changelog 与 Target version目标与版本、方言支持级别Bindings语言绑定.NET、Elixir、Java、JavaScript、PHP、Python、R、Rust 的官方绑定文档对应仓库 prqlc/bindings 下的实现Integrations集成prqlc CLI、ClickHouse、Jupyter、DuckDB、QStudio、Prefect、VS Code、PostgreSQL、Databend、Rill 以及语法高亮对应 grammars 目录下 CotEditor、GtkSourceView、KSyntaxHighlighting、emacs、nano、prql-lezer、raku 等多编辑器语法定义Contributing贡献指南development 与 language design。三、构建与本地运行两条路径web/book/README.md提供了两条构建路径适合不同的开发环境。3.1 一键式开发环境安装在仓库根目录已有 Task 与cargo的前提下执行task setup-dev这是根目录 Taskfile.yaml 中定义的总安装入口它并非只装书籍工具而是装配完整的 PRQL 开发环境依次执行task install-cargo-tools安装 Rust 工具链相关的 cargo 工具bacon、cbindgen、cargo-audit、cargo-insta、cargo-llvm-cov、cargo-release、cargo-nextest、default-target、mdbook、mdbook-admonish、mdbook-footnote、mdbook-toc、wasm-bindgen-cli、wasm-opt等见cargo_crates变量非 CI 环境走cargo install --locked从源码安装CI 环境走cargo binstall加速task check-vscode-extensions/task check-brew-dependencies仅提示性检查 VS Code 扩展与 brew 依赖hugo、jq、npm、uv、pre-commit、python3缺失时不阻断安装task install-maturin通过uv tool install maturin安装 Python 绑定构建工具task install-npm-dependencies全局安装prettier与prettier-plugin-go-templatepre-commit install-hooks装配 pre-commit 钩子rustup component add llvm-tools-preview添加覆盖率工具组件。其中setup-dev有一个硬性前置条件要求系统存在clang因为测试会用到 DuckDB缺失时会直接报错并给出 macOSxcode-select --install与 Debian Linuxapt-get update apt-get install clang的安装指引。3.2 精简路径只装 mdBook如果只想构建书籍本身web/book/README.md给出了精确的 cargo 命令cargo install --locked mdbook注意完整的书籍构建还需要 Taskfile.yaml 中cargo_crates列出的其他mdbook相关 cratemdbook-admonish、mdbook-footnote、mdbook-toc以及本项目自定义的mdbook-prql预处理器。mdbook-prql作为工作区成员 crate见 web/book/Cargo.toml其二进制通过cargo run --bin mdbook-prql按需编译运行。3.3 构建并本地预览task web:run-book该命令定义在 web/Taskfile.yaml 的run-book任务中run-book: desc: Build serve the book for interactive development. dir: book cmds: - mdbook serve --port3000 -n 0.0.0.0它在web/book目录下以端口 3000、绑定 0.0.0.0启动 mdBook 开发服务器浏览器访问http://localhost:3000即可实时预览支持热重载。README.md的脚注明确指出这条 task 等价于cd web/book mdbook serve默认端口为 mdBook 的 3000-n 0.0.0.0使局域网内其他机器也可访问。3.4 构建产物与发布路径若需要生成静态站点而非开发预览可在web/book下直接执行mdbook build产物输出到web/book/book/。在 web/Taskfile.yaml 的build任务中书籍构建完成后会通过 rsync 同步进网站目录- cd book mdbook build - rsync -ai --checksum --delete --no-times book/book/ website/public/book/即书籍最终作为 prql 官网的子路径/book/发布与 website、playground 一起构成完整的 Web 产物。四、PRQL 示例精讲从简单到完整web/book/README.md给出了两个 PRQL 示例它们是理解管道式语言的最佳入口。下面结合书籍正文与仓库源码逐行拆解。4.1 简单示例从表、过滤到聚合from tracks filter artist Bob Marley # Each line transforms the previous result aggregate { # aggregate reduces each column to a value plays sum plays, longest max length, shortest min length, # Trailing commas are allowed }from tracks声明数据来源表等价于 SQL 的FROM tracksfilter artist Bob Marley过滤行等价于 SQL 的WHERE注释指出每一行都是对上一行结果的变换这正是 PRQL 管道思维的核心aggregate { ... }将每一列归约为一个值聚合。大括号内是命名列定义plays sum plays表示计算plays列之和longest max length、shortest min length同理。注释还提示PRQL 允许尾随逗号Trailing commas are allowed。对应的 SQL 大致为SELECT SUM(plays) AS plays, MAX(length) AS longest, MIN(length) AS shortest FROM tracks WHERE artist Bob Marley4.2 完整示例变量的管道与抽象from employees filter start_date 2021-01-01 # Clear date syntax derive { # derive adds columns / variables gross_salary salary (tax ?? 0), # Terse coalesce gross_cost gross_salary benefits, # Variables can use other variables } filter gross_cost 0 group {title, country} ( # group runs a pipeline over each group aggregate { # aggregate reduces each group to a value average gross_salary, sum_gross_cost sum gross_cost, # sets a column name } ) filter sum_gross_cost 100_000 # filter replaces both of SQLs WHERE HAVING derive id f{title}_{country} # F-strings like Python derive country_code sLEFT(country, 2) # S-strings permit SQL as an escape hatch sort {sum_gross_cost, -country} # -country means descending order take 1..20 # Range expressions (also valid as take 20)逐行解读PRQL 片段含义对应 SQL 概念from employees数据来源FROM employeesfilter start_date 2021-01-01日期字面量用前缀语法清晰WHERE start_date DATE 2021-01-01derive { gross_salary ..., gross_cost ... }新增列/变量变量可引用前一个变量gross_cost引用gross_salarySELECT ... , ... AS ...salary (tax ?? 0)??是简洁的合并运算符coalescetax为空时取 0salary COALESCE(tax, 0)group {title, country} ( ... )按title, country分组对每组运行一个管道GROUP BY title, countryaggregate { average gross_salary, sum_gross_cost sum gross_cost }组内聚合设置列名AVG(...),SUM(...) AS ...filter sum_gross_cost 100_000数字下划线分隔可读性更好filter同时取代 SQL 的WHERE与HAVINGHAVING SUM(...) 100000derive id f{title}_{country}F-string类似 Python 的 f-string用于字符串插值CONCAT(title, _, country)derive country_code sLEFT(country, 2)S-string内嵌 SQL 作为逃生舱口LEFT(country, 2)sort {sum_gross_cost, -country}排序-country表示降序ORDER BY sum_gross_cost, country DESCtake 1..20区间表达式取前 20 行take 20同样合法LIMIT 20其中 f-strings、r-strings、s-strings 的详细语法分别见 f-strings、r-strings、s-strings区间与take见 ranges 与标准库 take。五、源码级深挖书籍示例如何被编译验证PRQL 书籍最有特色的机制在于所有 PRQL 代码块都会被真实编译并在页面中自动生成 PRQL↔SQL 对照表。这保证了文档示例始终与编译器实现保持一致。5.1 mdbook-prql 预处理器web/book/book.toml 中的[preprocessor.prql]声明了自定义预处理器其可执行文件是mdbook-prql工作区成员 crate见 web/book/Cargo.toml核心依赖prqlc与mdbook-preprocessor。入口代码位于 web/book/src/main.rs处理 mdBook 的supports子命令询问某个渲染器是否受支持从 stdin 解析 mdBook 传入的 JSON 书籍内容运行ComparisonPreprocessor将书中的 PRQL 代码块编译成 SQL并生成对照表将处理后的书籍序列化回 JSON 输出给 mdBook 主程序。这也解释了preprocessor.prql中command cargo run --bin mdbook-prql的用途——每次构建书籍时按需编译并运行该预处理器。5.2 快照测试文档即测试web/book/tests/documentation 目录承载了对书籍示例的自动化测试说明见 tests/documentation/README.md其中 book.rs 的test_prql_examples_compile会用pulldown-cmark解析src/下所有 Markdown 文件提取所有 PRQL 代码块跳过带no-eval标签的块逐个调用prqlc::compile编译为 SQL与 snapshots 目录下的 insta 快照比对若某块带error标签却编译成功或反之测试直接失败。此外test_prql_examples_display_then_compile还验证每个示例经格式化pl_to_prql后依然能编译通过test_date_format_specifiers_compile与test_target_dialects_documented则分别校验日期格式说明符表、方言支持列表与源码实现的一致性对应 prqlc/src/sql/dialect.rs 与 target.md。编译辅助函数定义在 tests/documentation/main.rs本质是对prqlc::compile的一层封装。也就是说书籍正文中的每一段 PRQL背后都有一份经过编译器验证的快照——文档示例不会过时。5.3 示例编译链路mdbook-prql与文档测试都依赖prqlccrate。编译流程可概括为解析Parsingprqlc-parser见 prqlc-parser/src将 PRQL 源码解析为语法树语义分析Semanticprqlc的 semantic 模块负责名称解析、类型推断、函数展开等其标准库定义在 semantic/std.prql中间表示IR先后生成 PLPipeline Language与 RQRelational Query两层中间表示见 ir/pl 与 ir/rqSQL 生成Codegensql 模块将 RQ 翻译为具体方言的 SQL支持 Postgres、DuckDB、ClickHouse、BigQuery 等多种方言见 dialect.rs。对照表正是这一链路的可视化产物让读者同时看到 PRQL 与等价 SQL直观理解管道式语言如何落地为数据库可执行的查询。六、书籍的文档测试体系除书籍示例外文档测试还覆盖了仓库其他位置的示例readme.rs 中的test_readme_examples用正则提取仓库根目录 README.md 中所有prql/elm代码块并逐一编译确保主 README 的示例同样可运行website.rs 负责校验网站web/website中的示例。换言之PRQL 项目将文档中的代码是否可运行纳入了自动化测试从语言书、网站到 README 三层文档都有对应的编译保障。七、快速上手建议阅读从 Tutorial 的 Relations 开始掌握from/filter/aggregate/derive/group/sort/take这套核心管道变换遇到语法细节时按需查阅 Reference 板块的语法与标准库章节。动手用上面 4.2 节的完整示例在 playground 中实时试验观察 PRQL 与生成 SQL 的对照。本地阅读源码书籍依次执行task setup-dev与task web:run-book在http://localhost:3000获得可交互的书籍页面若只想快速预览cargo install --locked mdbook后执行cd web/book mdbook serve即可。进阶验证修改书籍中的示例后运行 book.rs 的测试即可确认新示例能否编译并通过快照——文档的正确性由测试守护。PRQL Language Book 既是入门教程也是规格参考更是示例即测试理念的实践样本。理解其结构与构建方式无论是学习 PRQL 语言本身还是研究编译器的文档工程实践都能获得第一手的可操作经验。赞分享后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载相关推荐嵌入式语言 LSP 实战基于 Language Service 构建 html1 语言服务vscode-extension-samples 示例深度解析嵌入式语言 LSP 实战基于 Language Service 构建 html1 语言服务vscode extension samples 示例深度解析示例工程webpack examples 示例工程全景解析目录结构、构建机制与全量示例索引webpack examples 示例工程全景解析目录结构、构建机制与全量示例索引 本篇指南以 examples/README.md https://link前端构建开发工具基于 Astro Starlight 构建 The Concise TypeScript Book 官方文档站项目结构、命令与多语言配置全解析基于 Astro Starlight 构建 The Concise TypeScript Book 官方文档站项目结构、命令与多语言配置全解析 本篇文章以文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考