PRQL - SQLを置き換えを目指すモダンなデータ変換言語

S 20220628 110143

現在データベース(RDBMS)を操作する言語としては、「SQL」が最も普及しています。

SQLは多機能で長い歴史を持ちますが、英語風の構文を採用し、複雑な問い合わせを行わなければならない場合、ベテランの開発者でも頭を悩ませることになりがちです。

PRQL」は、この欠点を解決すべく開発が進められているデータ変換言語です。可読性が高く、明示的かつ宣言的で、SQLとは異なり、論理的な変換のパイプラインを形成し、変数や関数などの抽象化された機能をサポートしています。SQLにトランスパイルするため、SQLを使用する全てのデータベースで使用することができます。

例えば従業員テーブルから、米国の従業員の数、最大、最小のサラリーを探す場合、以下のような構文を使用します。

from employees
filter country == "USA"                       # Each line transforms the previous result.
aggregate [                                   # `aggregate` reduces column to a value.
  max salary,
  min salary,
  count,                                      # Closing commas are allowed :)
]

これはSQLでは以下のようになります。

SELECT
  MAX(salary),
  MIN(salary),
  COUNT(*)
FROM
  employees
WHERE
  country = 'USA'

この例ではそれほどでもありませんが、より複雑な例ではPRQLの方が読みやすくなります。

PRQL:

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_cost,  # 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 row.
    average gross_salary,
    sum_gross_cost = sum gross_cost,          # `=` sets a column name.
  ]
)
filter sum_gross_cost > 100000                # Identical syntax for SQL's `WHERE` & `HAVING`.
derive id = f"{title}_{country}"              # F-strings like python.
sort [sum_gross_cost, -country]               # `-country` means descending order.
take 1..20                                    # Range expressions (also valid here as `take 20`).

SQL:

output.sql
SELECT
  title,
  country,
  AVG(salary + COALESCE(tax, 0)),
  SUM(salary + COALESCE(tax, 0) + benefits_cost) AS sum_gross_cost,
  CONCAT(title, '_', country) AS id
FROM
  employees
WHERE
  start_date > DATE '2021-01-01'
  AND salary + COALESCE(tax, 0) + benefits_cost > 0
GROUP BY
  title,
  country
HAVING
  SUM(salary + COALESCE(tax, 0) + benefits_cost) > 100000
ORDER BY
  sum_gross_cost,
  country DESC
LIMIT
  20

PRQLの使用方法

PRQLの使用方法を学びたい場合「PRQL Playground」を使用するのが簡単です。

S 20220628 111607

▲画面の左側にPRQLを入力すると、SQLへの変換結果が右側に表示されます。PRQLの例文はこちらで確認可能です。

言語の仕様は「PRQL Language Book」で確認可能です。

プログラムから使いたい場合、Pythonバインディングの「prql-python」や、JavaScriptバインディングの「prql-js」、Rustで書かれたコンパイラ「prql-compiler」などを使用することができます。

まとめ

データベース操作言語として、現状ではSQLが圧倒的ですが、PRQLが普及すればより使いやすい問い合わせ言語がさまざまな場所で活用できることになるかもしれません。Hacker NewsでもPRQLの可能性に関する議論が行われています。ハッカー達がどのようにこのプロジェクトをとらえているのか、知りたい方は確認してみてはいかがでしょうか。

スポンサーリンク