PRQL: ภาษาคิวรีเชิงสัมพันธ์แบบไปป์ไลน์
(github.com/PRQL)- PRQL เป็นภาษาสมัยใหม่สำหรับการแปลงข้อมูล โดยมุ่งเป็น ภาษาแทน SQL ที่อ่านง่าย ชัดเจน และประกาศเจตนาได้เหมือน SQL
- คิวรีประกอบด้วย ไปป์ไลน์เชิงตรรกะ ที่แต่ละขั้นของการแปลงจะรับผลลัพธ์จากขั้นก่อนหน้า และรองรับ abstraction อย่างตัวแปรและฟังก์ชัน
- PRQL จะ คอมไพล์เป็น SQL เพื่อให้ใช้งานร่วมกับฐานข้อมูลทุกตัวที่ใช้ SQL ได้
- ตัวอย่างภาษานี้ใช้การแปลงอย่าง
from,filter,derive,group,aggregate,sort,takeโดยfilterทำหน้าที่แทนWHEREและHAVINGของ SQL - ความสามารถด้านไวยากรณ์มีทั้งการเขียนวันที่ที่ชัดเจน, coalesce, ตัวแปรที่อ้างอิงตัวแปรอื่น, F-string คล้าย Python, S-string ที่ใช้ SQL เป็น escape hatch, การเขียนลำดับแบบเรียงจากมากไปน้อย และ range expression
- มี PRQL Playground สำหรับทดลองบนเบราว์เซอร์, PRQL Book ซึ่งเป็นเอกสารภาษา และ prql-lang.org ที่มีการเปรียบเทียบกับ SQL และตัวอย่างต่างๆ
- ณ เดือนมิถุนายน 2026 สามารถใช้งานผ่านการเชื่อมต่อที่รองรับหรือ language binding ที่รองรับได้ แต่ยังคงมีบั๊กและฟีเจอร์ที่ขาดหายไปบางส่วน และขอบเขตความพร้อมสำหรับการนำไปใช้กับทีมที่ไม่ใช่สายเทคนิคยังจำกัดอยู่ที่คิวรีที่ค่อนข้างเรียบง่าย
- โฟกัสการพัฒนาคือการทำงานกับ resolver ใหม่, แก้บั๊กที่มีลำดับความสำคัญสูง, ปิดช่องว่างของฟีเจอร์ที่เหลือเพื่อให้ใช้ได้กับคิวรี SQL มาตรฐานส่วนใหญ่ และเพิ่มการรองรับแบบทดลองสำหรับโมดูลและโปรเจกต์หลายไฟล์
- จุดเชื่อมต่อที่มีให้ได้แก่ VS Code extension, Jupyter integration, QStudio integration, Jupyter magic, pyprql Docs, prqlc-js
- ที่เก็บโค้ดประกอบด้วยคอมไพเลอร์
prqlcที่เขียนด้วย Rust และส่วนเว็บคอนเทนต์webโดยprqlcทำหน้าที่คอมไพล์ PRQL เป็น SQL และมีทั้ง CLI กับ language binding หลายภาษา
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ตัวอย่างบนเว็บไซต์ https://prql-lang.org/ ดูเหมือนจะเป็นจุดแข็งที่สุดของ PRQL โดยเฉพาะ SQL ที่สร้างออกมานั้นสะอาดและอ่านเข้าใจง่าย ราวกับเป็นรูปแบบที่คนเขียนเองได้
เมื่อ 10–15 ปีก่อน เราสร้างฐานข้อมูลใหม่อย่าง Mongo, Riak, Influx แล้วพยายามโน้มน้าวนักพัฒนาแอปให้นำไปใช้ในโปรเจกต์ใหม่ แต่ทุกวันนี้มีทางเลือกแบบอนุรักษ์นิยมที่นำ แอดออนหรือ query preprocessor มาวางบน Postgres มากขึ้น เช่น EdgeDB, TimescaleDB, PRQL ทำให้เริ่มใช้งานได้ง่ายกว่ามาก
สคีมาและการ migrate ของฝั่ง Edge ก็ดี แต่ไวยากรณ์ของ PRQL อ่านเป็นธรรมชาติกว่า ในโค้ดแอปพลิเคชันมี data transformation pipeline อยู่แล้วมากมาย เช่น chain ของ map/filter ใน TypeScript, iterator ของ Rust, enumerable ของ Ruby, stream ของ Java, .NET LINQ และ Rx ในหลายภาษา แนวคิดนี้จึงคุ้นเคยมาก จุดที่ยอดเยี่ยมคือสามารถให้ PRQL สร้าง SQL ที่ดีออกมา บันทึกไว้ ตรวจสอบภายหลัง ดู execution plan และเพิ่ม index ในจุดที่จำเป็นได้
ตัวอย่างทำให้ SQL ดูเยิ่นเย้อเกินจริงโดยตั้งใจ
from employees / select {id, first_name, age} / sort age / take 10ดูดีกว่าSELECT ... FROM ... ORDER BY ... LIMIT ...ที่แยกหลายบรรทัด แต่ SQL จริงก็เขียนได้เป็นselect id, first_name, age from employees order by age limit 10เช่นกัน และแค่ไม่มีปีกกา แต่ต่างกันประมาณorder byกับsortจึงแทบเป็นแค่ ต่างกันหนึ่งสองตัวอักษรการสลับลำดับส่วนต่าง ๆ ของ query ได้เป็นเรื่องที่ทุกคนบ่นเกี่ยวกับ SQL ก็จริง แต่แลกมาด้วยวงเล็บหลายชนิด โคลอน และไวยากรณ์อื่น ๆ ที่ดูใส่เข้ามาโดยไม่มีเหตุผล อีกทั้งก็ไม่ได้ทำอะไรที่ SQL ทำไม่ได้อยู่แล้วเป็นพิเศษ เลยสงสัยว่า จุดดึงดูด คืออะไร
เพิ่ง merge การรองรับ PRQL เข้า ClickHouse: https://github.com/ClickHouse/ClickHouse/pull/50686
ตอนนี้ยังใกล้เคียงกับการทดลอง และยังไม่แน่ใจว่าจะใช้งานได้จริงหรือมีประโยชน์แค่ไหน มีความกังวลเกี่ยวกับ Rust อยู่เล็กน้อยด้วย: https://github.com/ClickHouse/ClickHouse/issues/52053#issuecomment-1643805521
หวังว่า PRQL จะเติบโตอย่างมากจนกลายเป็น ภาษาที่รองรับระดับ first-class ใน Postgres พีชคณิตเชิงสัมพันธ์นั้นงดงาม แต่ SQL เป็นงานออกแบบรุ่นแรกที่กระท่อนกระแท่น ซึ่งควรถูกแทนที่ตั้งแต่หลายสิบปีก่อนแล้ว
แม้แต่ Codd เองก็ไม่พอใจกับ SQL สิ่งที่เขาคิดค้นนั้นน่าทึ่ง แต่หลังจากนั้นเราได้เรียนรู้เรื่องการออกแบบภาษาโปรแกรมมาอีกมาก
ORDER BYปัญหานี้ปรากฏให้เห็นในลักษณะที่เมื่อห่อด้วย subquery แล้วการเรียงลำดับของ relation จะหายไป ซึ่งค่อนข้างเหนือความคาดหมาย data model ของ PRQL คล้ายกับ relational model มาก และความต่างใหญ่คือ relation ถูกนิยามเป็น อาร์เรย์ของ tuple จึงมีลำดับ หวังว่า PRQL จะเป็นที่รู้จักในฐานะ “ภาษาเชิงสัมพันธ์ Mk II”
ยังมีปลั๊กอิน DBeaver [3] ด้วย ซึ่งยังต้องปรับปรุงเอกสารและทำให้การใช้งานเรียบง่ายขึ้น แต่ก็น่าจะใช้ query Postgres ด้วย PRQL ได้เช่นกัน สุดท้าย ถ้าใช้ pyprql [4] ก็สามารถ query Postgres จาก Jupyter notebook ได้
[1]: https://github.com/ywelsch/duckdb-prql
[2]: https://duckdb.org/docs/extensions/postgres_scanner.html
[3]: https://github.com/PRQL/prql/issues/1643
[4]: https://github.com/PRQL/pyprql
อนึ่ง ผมเป็นผู้ร่วมพัฒนา PRQL
ตอนนั้นคิดว่าเป็นเพราะยังรู้น้อยเกินไปที่จะเข้าใจว่าทำไมต้องเป็นแบบนั้น แต่ตอนนี้รู้แล้วว่าไม่มีเหตุผลอะไรเลย SQL กลายเป็นเหมือนภาษาธรรมชาติ ต่อให้ไม่สมเหตุสมผลก็โต้แย้งไม่ได้ ต้องพูดไปตามนั้น แต่ SQL ไม่ใช่ภาษาธรรมชาติ และเราทำให้ดีกว่านี้ได้
หากข้อร้องเรียนหลักต่อ SQL คือการที่ไม่สามารถสลับลำดับ
SELECT,FROM,WHEREได้ ก็ถือว่าค่อนข้างดีทีเดียวสำหรับภาษาที่ออกแบบในยุค 70ในทางกลับกัน PRQL ดูเหมือนมีสัญญาณรบกวนตามอำเภอใจในไวยากรณ์อยู่มาก ไม่เข้าใจว่าทำไมเราควรชอบ
join side:left p=positions (p.id==employees.employee_id)มากกว่าLEFT JOIN positions AS p ON p.id = employees.employee_idวิธีที่แต่ละขั้นจากบนลงล่างเป็น การแปลง ของขั้นก่อนหน้าแบบ PRQL นั้นสมเหตุสมผลกว่ามาก SQL ต้องพึ่งคู่มืออ้างอิง แต่ PRQL ให้ความรู้สึกเหมือนเขียนสิ่งที่อยากให้คิวรีทำลงไปตรง ๆ อย่างไรก็ตาม ไวยากรณ์ join ของ PRQL แย่มาก และควรรักษาคีย์เวิร์ดแบบ
left joinที่ชัดเจนไว้ อีกทั้งควรทำการย่อ alias และคอลัมน์ join ให้ดีกว่านี้ได้อย่างแรก ไม่สามารถใช้คอลัมน์ที่เลือกไว้ก่อนหน้าใน
selectเดียวกันในภายหลังได้ เช่น หลังจากgnarly_calculation AS some_valueแล้วจะเขียนsome_value * 2 AS some_value_doubledไม่ได้ ต้องห่อด้วย subquery อย่างที่สอง ไม่สามารถระบุ คอลัมน์ทั้งหมด ยกเว้นบางคอลัมน์ ได้ เวลาต้องดึงค่าคำนวณกลางจาก subquery ขึ้นมาแต่ไม่ต้องการให้อยู่ในผลลัพธ์สุดท้าย ก็ไม่สามารถพูดแบบ* EXCEPT some_valueได้ ต้องไล่ระบุคอลัมน์ผลลัพธ์ที่ต้องการทั้งหมดตัวอย่างที่เลือกมาอาจเป็นกรณีที่วงเล็บกับจุลภาคช่วยได้มาก แต่ในบริบทของภาษาทั้งหมดก็ไม่ได้แย่ขนาดนั้น
:ถูกใช้สม่ำเสมอเหมือน อาร์กิวเมนต์แบบคีย์เวิร์ด ส่วน=ดูเหมือนใช้กับ aliasjoinและคำแรกของประโยคคือjoinทำให้ชัดเจนขึ้นว่าการดำเนินการจริงคืออะไรแม้แต่ตัวอย่างการเรียกฟังก์ชันทั่วไป
foo(bar)ก็ยังดีกว่า “bar to foo()”PRQL 0.9 เพิ่งปล่อยออกมาเมื่อไม่กี่ชั่วโมงก่อน จังหวะเหมาะพอดี ดู release notes ได้ที่นี่: https://github.com/PRQL/prql/releases/tag/0.9.0
มี breaking change ค่อนข้างใหญ่คือไวยากรณ์ tuple เปลี่ยนจาก
[]เป็น{}ตอนแรกสิ่งเหล่านี้ดูเหมือน list แต่เมื่อเวลาผ่านไปก็รู้ว่าจริง ๆ แล้วมันคือ tuple ตาม release notes หากปล่อย[]ให้โล่งไว้ ก็จะเริ่มรองรับ array ได้ในเร็ว ๆ นี้ อนึ่ง ผมเป็นผู้มีส่วนร่วมกับ PRQLข้อจำกัดของ PRQL คือโดยการออกแบบแล้วรองรับเฉพาะ SELECT เท่านั้น หากต้องการ insert/modify/delete ข้อมูล ก็ต้องกลับไปใช้ SQL
นักวิทยาศาสตร์ข้อมูลในทีมอาจส่งคิวรีเป็น PRQL ได้ แต่ถ้าจะใส่เข้าไปใน data pipeline จริง ก็ต้องแปลเป็น SQL อย่างน้อยถ้ารองรับฟีเจอร์แบบจำกัด เช่น insert ลงตารางชั่วคราวใหม่ได้ก็คงดี เช่นรูปแบบ
from tracks / filter artist == "Bob Marley" / save bob_marley_tmpinsert/update/deleteที่ต้องมาอยู่ท้าย pipeline และให้รับชื่อตารางเป็นอาร์กิวเมนต์ก็พอSQL อย่าง
UPDATE counters SET value = value + 1 WHERE name LIKE 'prefix.%'น่าจะเขียนใน PRQL ได้แบบfrom counters / filter startswith(name, 'prefix.') / derive { new_value = value + 1 } / select { name, new_value } / update countersบทความที่ขาดไม่ได้ตรงนี้: “I don't want to learn your garbage query language” [1]
[1] https://erikbern.com/2018/08/30/i-dont-want-to-learn-your-garbage-query-language.html
เป้าหมายของ PRQL คือการเป็น ภาษาที่ยอดเยี่ยม สำหรับรวมเป็นหนึ่งเดียวและสร้างต่อยอดบนมัน ไม่อยากสร้างภาษา N ภาษาให้กับฐานข้อมูล N ตัว PRQL จะเป็นโอเพนซอร์สเสมอและจะไม่ทำผลิตภัณฑ์เชิงพาณิชย์ ดังนั้นผมมองว่ามันเป็นไปได้จริงกว่าภาษาที่ผูกกับแต่ละฐานข้อมูลหรือแต่ละผลิตภัณฑ์มาก ผมเป็นนักพัฒนา PRQL
Show HN ก่อนหน้า: https://news.ycombinator.com/item?id=31897430
“Show HN: PRQL 0.2 – a better SQL” โพสต์โดย maximilianroos เมื่อ 27 มิถุนายน 2022 ได้ 378 คะแนน มี 161 ความเห็น
โพสต์ต้นฉบับที่เสนอครั้งแรก: https://news.ycombinator.com/item?id=30060784
“PRQL – A proposal for a better SQL” โพสต์โดย maximilianroos เมื่อ 24 มกราคม 2022 ได้ 650 คะแนน มี 295 ความเห็น
นึกถึง KQL ของ Microsoft: https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/
ไวยากรณ์ไม่ได้สำคัญมากนัก สิ่งที่สำคัญคือ ตัวเพิ่มประสิทธิภาพ ทำอะไร
ตอนนี้ปัญหาจำนวนมากของ SQL ดูเหมือนเป็นภาระตกค้างจากอดีต เอนจินรุ่นเก่าเคยจัดการไวยากรณ์สมัยใหม่ได้ไม่ดี ทำให้ผู้คนจำนวนมากถูกฝึกให้เขียนคิวรีที่อ่านยาก ซับซ้อน และซ้อนกันลึกมาก ตัวอย่างเช่น นิพจน์ตารางร่วม (CTE) มักถูก materialize ทันที จึงเต็มไปด้วยสไตล์เก่า ๆ อย่าง
SELECT FROM (SELECT FROM (SELECT FROM A JOIN (SELECT ) B ON A.x=B.x)))ด้วยการปรับปรุงการจัดการ CTE ของเอนจิน ทำให้การเขียนคิวรีที่เข้าใจได้และประกอบร่วมกันได้อย่าง
WITH A AS (...), WITH B AS (...), WITH C AS (SELECT y FROM A) SELECT result FROM C WHERE ...ทำได้ง่ายขึ้นเรื่อย ๆ เมื่อมีฟีเจอร์อย่าง window functions สมัยใหม่,SELECT * EXCEPTและความสามารถที่ซับซ้อนขึ้นอย่างTOP X FOLLOWINGเพิ่มเข้ามา SQL ก็สามารถเรียบง่ายขึ้นได้ในสภาพแวดล้อมแบบนี้ ผมไม่คิดว่าการปรับปรุงเล็ก ๆ ในรูปแบบไวยากรณ์อื่นอย่าง PRQL จะให้ประโยชน์มากนัก อาจเขียนใหม่เป็น pipeline ที่ดูเหมือน imperative ได้ก็จริง แต่ optimizer ก็อาจทิ้งบางส่วนของมันไปได้ เป็นความจริงที่ SQL ยังมีสิ่งที่ควรทำให้ดีกว่านี้ แต่ผมยังไม่เห็นเหตุผลที่น่าเชื่อถือสำหรับความแตกต่างด้านรูปลักษณ์หรือไวยากรณ์