1 个不稳定版本
0.1.0 | 2024年2月24日 |
---|
#2615 在 数据库接口
27KB
410 行
PostgreSQL 中的 PRQL!
PL/PRQL 是一个 PostgreSQL 扩展,允许您使用 PRQL 编写函数。该扩展支持 Linux 和 macOS 上的 PostgreSQL v12-16。
什么是 PRQL?
PRQL (Pipelined Relational Query Language) 是一种开源的数据操作和分析查询语言,它可以编译成 SQL。PRQL 引入了一个管道概念(类似于 Unix 管道),逐行转换数据。一系列的转换降低了嵌套 SQL 查询中常见的复杂性,使得您的数据操作逻辑更容易阅读和编写。
主要功能
- 使用 PRQL 编写函数 - 适用于大型分析查询
- PRQL 编译器 - 适用于开发和调试
- 内联执行 - 适用于原型设计和 ORMs 中的自定义查询
函数
当您的 SQL 查询变得非常长且复杂时,PRQL 就特别有用。您可以通过将最令人印象深刻的 SQL 代码转换为 PRQL 函数来管理这种复杂性,这些函数然后可用于仪表板、业务逻辑或其他数据库代码。例如
create function match_stats(int) returns table(player text, kd_ratio float) as $$
from matches
filter match_id == $1
group player (
aggregate {
total_kills = sum kills,
total_deaths = sum deaths
}
)
filter total_deaths > 0
derive kd_ratio = total_kills / total_deaths
select { player, kd_ratio }
$$ language plprql;
select * from match_stats(1001)
player | kd_ratio
---------+----------
Player1 | 0.625
Player2 | 1.6
(2 rows)
这类似于 PL/Python、PL/JavaScript 和 PL/Rust 的实现。
PRQL 编译器
您可以使用 PRQL 编译器查看 PostgreSQL 在底层执行的 SQL 语句。您可以使用 prql_to_sql()
函数将上面的 PRQL 示例编译为 SQL
select prql_to_sql(...); -- statements above omitted for brevity
prql_to_sql
-------------
WITH table_0 AS (
SELECT player, COALESCE(SUM(kills), 0) AS _expr_0, COALESCE(SUM(deaths), 0) AS _expr_1
FROM matches
WHERE match_id = $1
GROUP BY player
)
SELECT player, _expr_0 / _expr_1 AS kd_ratio
FROM table_0
WHERE _expr_1 > 0
-- Generated by PRQL compiler version:0.11.1 (https://prql-lang.org)
(1 row)
内联执行
您可以直接使用 prql
函数运行 PRQL 代码。这对于例如在 ORMs 中进行自定义查询非常有用
select prql('from matches | filter player == ''Player1''')
as (id int, match_id int, round int, player text, kills int, deaths int)
limit 2;
id | match_id | round | player | kills | deaths
----+----------+-------+---------+-------+--------
1 | 1001 | 1 | Player1 | 4 | 1
3 | 1001 | 2 | Player1 | 1 | 7
(2 rows)
-- Same as above, but returns cursor
select prql('from matches | filter player == ''Player1''', 'player1_cursor');
fetch 2 from player1_cursor;
有关扩展的设计,请参阅 设计文档。
有关 PRQL 的更多信息,请访问 PRQL 网站、沙箱或 仓库。
[!NOTE]
PRQL 仅支持
select
语句。insert
、update
和delete
语句以及您的其他数据库代码将继续使用纯 SQL、ORM 或其他数据库框架。
入门
安装 Deb 文件
按照以下步骤安装 deb 文件
-
从发布页面下载与您的操作系统匹配的deb文件。
-
打开终端,切换到下载.deb文件的目录。使用dpkg安装包,例如:
sudo dpkg -i plprql-0.1.0-postgresql-16-debian-bookworm-amd64.deb
-
如果dpkg报告缺少依赖项,运行以下命令来解决它们
sudo apt-get install -f
从源代码安装
按照以下任一步骤从源代码安装
-
下载并执行
install.sh
bash脚本curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/kaspermarstal/plprql/main/scripts/install.sh | bash
这将使用您的路径上的
pg_config
安装主分支的最新版本。 -
您可以使用
--pg-config
和--revision
标志来自定义PostgreSQL安装和/或PL/PRQL版本curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/kaspermarstal/plprql/main/scripts/install.sh > install.sh chmod +x ./install.sh ./install.sh --pg-version /usr/bin/pg_config --revision 186faea
设置开发环境
PL/PRQL是建立在pgrx框架之上的,用于在Rust中编写PostgreSQL扩展。此框架附带您需要安装的开发工具。按照以下步骤设置您的开发环境
-
安装
cargo-pgrx
。cargo install --locked --version=0.11.3 cargo-pgrx
cargo-pgrx
的版本必须与plprql/Cargo.toml
中pgrx
的版本匹配。 -
为您系统初始化
pgrx
。cargo pgrx init --pg16 <PG16>
其中
<PG16>
是您的系统安装的pg_config
工具的路径(通常是/usr/bin/pg_config
)。支持的版本是PostgreSQL v12-16。您也可以运行cargo pgrx init
并让pgrx
下载、安装和编译PostgreSQL v12-16。这些安装由pgrx
管理,并用于开发和测试。可以使用例如cargo pgrx init --pg16 download
安装单个由pgrx
管理的安装。 -
克隆此存储库。
git clone https://github.com/kaspermarstal/plprql
-
进入根目录并安装到当前路径上
pg_config
指定的PostgreSQL。cd plprql/plprql cargo pgrx install --release
您可以通过使用
-c
标志提供另一个pg_config
的路径来针对特定的PostgreSQL安装。 -
启动您的系统PostgreSQL安装并立即开始编写函数!您也可以在由
pgrx
管理的安装中尝试PL/PRQL$ cargo pgrx run pg16 psql> create extension plprql; psql> create function match_stats(int) returns table(total_kills real, total_deaths real) as $$ from rounds filter match_id == $1 aggregate { total_kills = sum kills, total_deaths = sum deaths } $$ language plprql psql> select match_stats(1);
运行测试
您可以使用cargo pgrx test pg16
运行测试。单元测试在主plprql
crate中,集成测试在plprql-tests
crate中。从根源目录
cd plprql && echo "\q" | cargo pgrx run pg16 && cargo test --no-default-features --features pg16
cd ../plprql-tests && echo "\q" | cargo pgrx run pg16 && cargo test --no-default-features --features pg16
支持的PostgreSQL版本是pg12
、pg13
、pg14
、pg15
和pg16
。
许可证
Apache 2.0许可证
依赖项
~30–44MB
~835K SLoC