現在データベース(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」を使用するのが簡単です。
▲画面の左側にPRQLを入力すると、SQLへの変換結果が右側に表示されます。PRQLの例文はこちらで確認可能です。
言語の仕様は「PRQL Language Book」で確認可能です。
プログラムから使いたい場合、Pythonバインディングの「prql-python」や、JavaScriptバインディングの「prql-js」、Rustで書かれたコンパイラ「prql-compiler」などを使用することができます。
まとめ
データベース操作言語として、現状ではSQLが圧倒的ですが、PRQLが普及すればより使いやすい問い合わせ言語がさまざまな場所で活用できることになるかもしれません。Hacker NewsでもPRQLの可能性に関する議論が行われています。ハッカー達がどのようにこのプロジェクトをとらえているのか、知りたい方は確認してみてはいかがでしょうか。