1 个不稳定版本

0.1.0 2024年2月24日

#2615数据库接口

Apache-2.0

27KB
410

Linux Linux

PostgreSQL 中的 PRQL!

PL/PRQL 是一个 PostgreSQL 扩展,允许您使用 PRQL 编写函数。该扩展支持 Linux 和 macOS 上的 PostgreSQL v12-16。

什么是 PRQL?

PRQL (Pipelined Relational Query Language) 是一种开源的数据操作和分析查询语言,它可以编译成 SQL。PRQL 引入了一个管道概念(类似于 Unix 管道),逐行转换数据。一系列的转换降低了嵌套 SQL 查询中常见的复杂性,使得您的数据操作逻辑更容易阅读和编写。

主要功能

函数

当您的 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 语句。 insertupdatedelete 语句以及您的其他数据库代码将继续使用纯 SQL、ORM 或其他数据库框架。

入门

安装 Deb 文件

按照以下步骤安装 deb 文件

  1. 发布页面下载与您的操作系统匹配的deb文件。

  2. 打开终端,切换到下载.deb文件的目录。使用dpkg安装包,例如:

    sudo dpkg -i plprql-0.1.0-postgresql-16-debian-bookworm-amd64.deb
    
  3. 如果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扩展。此框架附带您需要安装的开发工具。按照以下步骤设置您的开发环境

  1. 安装cargo-pgrx

    cargo install --locked --version=0.11.3 cargo-pgrx
    

    cargo-pgrx的版本必须与plprql/Cargo.tomlpgrx的版本匹配。

  2. 为您系统初始化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管理的安装。

  3. 克隆此存储库。

    git clone https://github.com/kaspermarstal/plprql
    
  4. 进入根目录并安装到当前路径上pg_config指定的PostgreSQL。

    cd plprql/plprql
    cargo pgrx install --release
    

    您可以通过使用-c标志提供另一个pg_config的路径来针对特定的PostgreSQL安装。

  5. 启动您的系统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运行测试。单元测试在主plprqlcrate中,集成测试在plprql-testscrate中。从根源目录

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版本是pg12pg13pg14pg15pg16

许可证

Apache 2.0许可证

依赖项

~30–44MB
~835K SLoC