PRQL: Boru hatlı ilişkisel sorgu dili
(github.com/PRQL)- PRQL, veriyi dönüştürmeye yönelik modern bir dil olup SQL gibi okunabilir, açık ve bildirime dayalı bir SQL alternatifi olmayı hedefler
- Sorgular, dönüşüm adımlarının önceki sonucu devraldığı mantıksal bir boru hattı olarak yapılandırılır ve değişkenler ile fonksiyonlar gibi soyutlamaları destekler
- SQL kullanan tüm veritabanlarıyla birlikte kullanılabilmesi için PRQL SQL'e derlenir
- Dil örnekleri
from,filter,derive,group,aggregate,sort,takegibi dönüşümleri kullanır;filter, SQL'dekiWHEREveHAVINGrollerinin yerini alır - Söz dizimi özellikleri arasında açık tarih gösterimi, coalesce, başka değişkenlere başvuran değişkenler, Python'a benzer F-string, SQL'i escape hatch olarak kullanan S-string, azalan sıralama gösterimi ve aralık ifadeleri bulunur
- Tarayıcıda deneme için PRQL Playground, dil dokümantasyonu olan PRQL Book ve SQL karşılaştırmaları ile örnekler sunan prql-lang.org sağlanır
- Haziran 2026 itibarıyla, desteklenen entegrasyonlar veya desteklenen dil binding'leri üzerinden kullanılabilir; ancak bazı hatalar ve eksik özellikler hâlâ vardır ve teknik olmayan ekiplere dağıtım için hazır kapsam oldukça basit sorgularla sınırlıdır
- Geliştirme odağı; yeni resolver çalışması, öncelikli hataların çözülmesi, standart SQL sorgularının çoğunda kullanılabilmesi için kalan özellik açıklarının kapatılması ve modüller ile çok dosyalı projeler için deneysel desteğin eklenmesidir
- Entegrasyon noktaları olarak VS Code extension, Jupyter integration, QStudio integration, Jupyter magic, pyprql Docs, prqlc-js sunulur
- Depo, Rust ile yazılmış
prqlcderleyicisi ve web içerik alanıwebden oluşur;prqlc, PRQL'i SQL'e derler ve CLI ile çeşitli dil binding'lerini içerir
1 yorum
Hacker News yorumları
Web sitesindeki https://prql-lang.org/ örnekler PRQL’in en büyük avantajı gibi görünüyor; özellikle üretilen SQL temiz ve sezgisel, insanın doğrudan yazmış olabileceği türden.
10–15 yıl önce Mongo, Riak, Influx gibi yeni veritabanları yapıp uygulama geliştiricilerini yeni projelerde bunları kullanmaya ikna etmeye çalışırdık; bugün ise EdgeDB, TimescaleDB, PRQL gibi Postgres’in üzerine eklenti veya sorgu ön işleyicisi koyan daha muhafazakâr seçenekler arttı ve benimsemeleri çok daha kolay.
Edge tarafındaki şema ve migration’lar da iyi, ama PRQL sözdizimi daha sezgisel. TypeScript’in map/filter zincirleri, Rust iterator’ları, Ruby enumerable’ları, Java stream’leri, .NET LINQ, çeşitli dillerdeki Rx gibi uygulama kodlarında zaten çok sayıda veri dönüştürme pipeline’ı olduğu için kavram oldukça tanıdık. PRQL’den iyi SQL üretip saklayabilmek, sonra kontrol edebilmek, yürütme planına bakabilmek ve gereken yerlere indeks ekleyebilmek harika.
Örnekler SQL’i keyfî olarak daha uzun görünür hâle getiriyor. Çok satıra bölünmüş
SELECT ... FROM ... ORDER BY ... LIMIT ...yerinefrom employees / select {id, first_name, age} / sort age / take 10daha iyi görünüyor, ama gerçek SQL deselect id, first_name, age from employees order by age limit 10diye yazılabilir; süslü parantez olmaması karşılığındaorder byilesortfarkı kadar, yani bir iki karakterlik fark gibi.Sorgu bölümlerinin sırasını değiştirebilmek herkesin SQL hakkında şikâyet ettiği bir nokta, ama bunun yerine farklı türde parantezler, iki noktalar ve başka sözdizimi öğeleri nedensizce giriyor; SQL’in zaten yapamadığı bir şeyi özellikle başardığı da görünmüyor. Cazibe noktası nedir, merak ediyorum.
Yakın zamanda ClickHouse’a PRQL desteğini merge ettik: https://github.com/ClickHouse/ClickHouse/pull/50686
Şimdilik daha çok deneysel sayılır; gerçekten kullanılabilir ya da faydalı olup olmayacağı kesin değil. Rust ile ilgili bazı endişeler de var: https://github.com/ClickHouse/ClickHouse/issues/52053#issuecomment-1643805521
PRQL’in büyük ölçüde büyüyüp Postgres’te birinci sınıf desteklenen bir dil olmasını isterim. İlişkisel cebir güzel, ama SQL onlarca yıl önce değiştirilmesi gereken sakar bir ilk tasarımdı.
Codd bile SQL’den memnun değildi. Onun icat ettiği şey şaşırtıcı, ama o zamandan beri programlama dili tasarımı hakkında çok şey öğrendik.
ORDER BYile bozması gibi birçok yerde modele ters düşüyor.Bu sorun, alt sorguyla sardığınızda ilişkinin sıralamasının kaybolması gibi şekillerde ortaya çıkıyor ki bu epey beklenmedik. PRQL’in veri modeli ilişkisel modele çok benziyor; büyük fark, ilişkilerin tuple dizileri olarak tanımlanması ve bu yüzden sıralı olması. PRQL’in “ilişkisel dil Mk II” olarak bilinmesini umuyorum.
Bir DBeaver eklentisi [3] de var; daha fazla dokümantasyon ve kullanım kolaylaştırması gerekiyor ama bununla da Postgres’i PRQL ile sorgulamak mümkün olabilir. Son olarak pyprql [4] kullanırsanız Jupyter notebook içinden Postgres’i sorgulayabilirsiniz.
[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
Not: PRQL katkıcısıyım.
O zaman bunun neden böyle olması gerektiğini anlayacak kadar bilmediğimi sanmıştım; artık böyle bir nedeni olmadığını biliyorum. SQL doğal dil gibi olup çıktı: mantıksız olsa da itiraz edemiyorsunuz, sadece öyle konuşmanız gerekiyor. Ama SQL doğal dil değil ve daha iyisi yapılabilir.
SQL hakkındaki başlıca şikâyet
SELECT,FROM,WHEREsırasının değiştirilememesiyse, 70’lerde tasarlanmış bir dil için oldukça iyi sayılır.Buna karşılık PRQL’in söz diziminde epey keyfî gürültü var gibi görünüyor.
join side:left p=positions (p.id==employees.employee_id)yazımını nedenLEFT JOIN positions AS p ON p.id = employees.employee_idyerine tercih etmem gerektiğini bilmiyorum.PRQL’de olduğu gibi, yukarıdan aşağıya her adımın bir önceki adımın dönüşümü olması çok daha mantıklı. SQL’de referans kılavuzuna ihtiyaç duyuluyor; PRQL ise sorgunun yapmasını istediğiniz şeyi olduğu gibi yazıyormuşsunuz hissi veriyor. Yine de PRQL’in join söz dizimi çok kötü; açık
left jointürü anahtar sözcükleri korumalıydı, takma adlar ve join sütunu kısaltmaları da daha iyi tasarlanabilirdi.Birincisi, aynı
selectiçinde daha önce seçilen bir sütunu daha sonra kullanamıyorsunuz.gnarly_calculation AS some_valuesonrasındasome_value * 2 AS some_value_doubledgibi yazamıyor, alt sorguyla sarmalamanız gerekiyor. İkincisi, belirli sütunlar hariç tüm sütunları belirtemiyorsunuz. Ara hesaplamaları alt sorgudan yukarı taşımak gerekiyor ama nihai çıktıda gerekmiyorsa,* EXCEPT some_valuegibi söyleyemiyor; istediğiniz tüm çıktı sütunlarını tek tek listelemek zorunda kalıyorsunuz.Seçilen örnek, parantezlerin ve virgüllerin çok işe yaradığı bir durum olabilir; ama dilin genel bağlamında o kadar kötü değil.
:tutarlı biçimde anahtar sözcük argümanı gibi kullanılıyor,=ise takma adlar için kullanılıyor gibi.joinişleminin bir argümanı oluyor ve cümlenin ilk kelimesijoinolduğu için asıl işlemin ne olduğu daha belirgin hale geliyor.Genel bir fonksiyon çağrısı örneğinde de
foo(bar), “bar to foo()”dan daha iyidir.PRQL 0.9 birkaç saat önce yayımlandı; zamanlama iyi. Sürüm notlarını burada görebilirsiniz: https://github.com/PRQL/prql/releases/tag/0.9.0
Tuple söz diziminin
[]’den{}’ye değiştiği, oldukça büyük bir geriye uyumsuz değişiklik var. Başta bunlar liste gibi görünüyordu; fakat zamanla aslında tuple olduklarını fark ettik. Sürüm notlarında belirtildiği gibi,[]’yi boşta bırakırsak yakında dizi desteğini başlatabiliriz. Not: PRQL katkıcısıyım.PRQL’in sınırı, tasarım gereği yalnızca SELECT desteklemesi. Veri eklemek/değiştirmek/silmek için tekrar SQL’e dönmeniz gerekiyor.
Takımdaki veri bilimci PRQL ile sorgu verebilir; ama bunu gerçek veri pipeline’ına koymak için SQL’e çevirmek gerekir. En azından yeni bir geçici tabloya ekleme gibi sınırlı bir işlevi desteklese iyi olurdu. Örneğin
from tracks / filter artist == "Bob Marley" / save bob_marley_tmpgibi.insert/update/deleteoperatörleri koyup, tablo adını argüman olarak almalarını sağlamak yeterli.UPDATE counters SET value = value + 1 WHERE name LIKE 'prefix.%'gibi bir SQL, PRQL’defrom counters / filter startswith(name, 'prefix.') / derive { new_value = value + 1 } / select { name, new_value } / update countersşeklinde yazılabilir.Burada eksik kalmaması gereken yazı: “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’in hedefi, entegre edilmesi ve üzerine bir şeyler inşa edilmesi kolay harika bir dil olmak. N tane veritabanı için N tane dil yapmak istemiyoruz. PRQL her zaman açık kaynak olacak ve ticari bir ürün geliştirmeyecek; bu yüzden veritabanına/ürüne özel dillere kıyasla çok daha gerçekleştirilebilir olduğunu düşünüyorum. PRQL geliştiricisiyim.
Önceki Show HN: https://news.ycombinator.com/item?id=31897430
“Show HN: PRQL 0.2 – a better SQL”, 27 Haziran 2022’de maximilianroos tarafından paylaşılmıştı; 378 puan ve 161 yorum almıştı.
İlk önerildiği orijinal gönderi: https://news.ycombinator.com/item?id=30060784
“PRQL – A proposal for a better SQL”, 24 Ocak 2022’de maximilianroos tarafından paylaşılmıştı; 650 puan ve 295 yorum almıştı.
Microsoft’un KQL’ini hatırlatıyor: https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/
Sözdizimi o kadar da önemli değil; asıl önemli olan optimizer’ın ne yaptığıdır
Günümüzdeki birçok SQL sorunu eski bir yük gibi görünüyor. Eski motorlar modern söz dizimini iyi işleyemediği için, birçok kişi okunması zor, karmaşık ve derinlemesine iç içe geçmiş sorgular yazmaya alıştı. Örneğin ortak tablo ifadelerine (CTE) bakınca hemen materyalize ediyorlardı; bu yüzden
SELECT FROM (SELECT FROM (SELECT FROM A JOIN (SELECT ) B ON A.x=B.x)))gibi eski tarz yaygındıMotorların CTE işleme yeteneklerindeki iyileşmeler sayesinde
WITH A AS (...), WITH B AS (...), WITH C AS (SELECT y FROM A) SELECT result FROM C WHERE ...gibi anlaşılabilir ve birleştirilebilir sorgular yazmak giderek kolaylaşıyor. Modern window function’lar,SELECT * EXCEPT, daha karmaşıkTOP X FOLLOWINGgibi özellikler eklendiğinde SQL daha da sadeleşebilirBöyle bir ortamda PRQL gibi farklı bir sözdizimi biçiminin küçük iyileştirmelerinin büyük fayda sağlayacağını düşünmüyorum. Emir kipi gibi görünen bir pipeline olarak yeniden yazılabilir, ancak optimizer bunun bazı kısımlarını atabilir. SQL’de daha iyi yapılması gereken şeyler olduğu doğru, fakat biçimsel/sözdizimsel farklar için ikna edici bir gerekçeyi henüz görmedim