PRQL: linguagem de consulta relacional em pipeline
(github.com/PRQL)- PRQL é uma linguagem moderna para transformar dados, buscando ser uma alternativa ao SQL que, como SQL, seja legível, explícita e declarativa
- As consultas são compostas como um pipeline lógico, em que cada etapa de transformação recebe o resultado anterior, e oferecem suporte a abstrações como variáveis e funções
- O PRQL é compilado para SQL para que possa ser usado com qualquer banco de dados que use SQL
- Os exemplos da linguagem usam transformações como
from,filter,derive,group,aggregate,sortetake;filtersubstitui os papéis doWHEREe doHAVINGdo SQL - Entre os recursos de sintaxe estão notação clara de datas, coalesce, variáveis que referenciam outras variáveis, F-strings semelhantes às do Python, S-strings que usam SQL como escape hatch, notação de ordenação decrescente e expressões de intervalo
- Oferece o PRQL Playground para experimentação no navegador, o PRQL Book como documentação da linguagem e o prql-lang.org com comparações e exemplos em SQL
- Em junho de 2026, pode ser usado por meio de integrações ou bindings de linguagem compatíveis, mas ainda restam alguns bugs e funcionalidades ausentes, e o escopo pronto para implantação voltada a equipes não técnicas permanece limitado a consultas bastante simples
- O foco de desenvolvimento é o trabalho em um novo resolver, a correção de bugs prioritários, o fechamento das lacunas de funcionalidades restantes para permitir uso na maior parte das consultas SQL padrão e a adição de suporte experimental a módulos e projetos com múltiplos arquivos
- Como pontos de integração, oferece extensão para VS Code, integração com Jupyter, integração com QStudio, Jupyter magic, pyprql Docs e prqlc-js
- O repositório é composto pelo compilador
prqlc, escrito em Rust, e pela área de conteúdo webweb; oprqlccompila PRQL para SQL e inclui uma CLI e bindings para várias linguagens
1 comentários
Opiniões do Hacker News
Os exemplos no site https://prql-lang.org/ parecem ser a maior vantagem do PRQL, especialmente porque o SQL gerado é limpo e intuitivo, com uma forma que alguém poderia ter escrito à mão
Há 10~15 anos, criavam-se novos bancos de dados como Mongo, Riak e Influx e tentava-se convencer desenvolvedores de apps a usá-los em novos projetos; hoje, porém, há cada vez mais opções conservadoras, como EdgeDB, TimescaleDB e PRQL, que colocam addons ou pré-processadores de consulta sobre o Postgres, o que torna a adoção muito mais fácil
O esquema e as migrações do Edge também são bons, mas a sintaxe do PRQL é mais intuitiva. Como já existem muitos pipelines de transformação de dados no código de aplicações — como cadeias de map/filter do TypeScript, iteradores do Rust, enumerables do Ruby, streams do Java, LINQ do .NET e Rx em várias linguagens — o conceito é muito familiar. É ótimo poder extrair bom SQL do PRQL, salvá-lo, verificá-lo depois, ver o plano de execução e adicionar índices onde for necessário
Os exemplos fazem o SQL parecer arbitrariamente mais verboso.
from employees / select {id, first_name, age} / sort age / take 10parece melhor do queSELECT ... FROM ... ORDER BY ... LIMIT ...dividido em muitas linhas, mas o SQL real também pode ser escrito comoselect id, first_name, age from employees order by age limit 10; em vez de chaves, a diferença fica mais ou menos entreorder byesort, ou seja, algo próximo de uma ou duas letras de diferençaPoder mudar a ordem das seções da consulta é algo de que todo mundo reclama no SQL, mas em troca entram vários tipos de parênteses, dois-pontos e outras sintaxes sem motivo aparente, e também não parece realizar nada que o SQL já não faça. Fico curioso para saber qual é o ponto de atração
Recentemente foi mesclado suporte a PRQL no ClickHouse: https://github.com/ClickHouse/ClickHouse/pull/50686
Por enquanto ainda parece mais um experimento, e não está claro se será realmente utilizável ou útil. Também há algumas preocupações relacionadas a Rust: https://github.com/ClickHouse/ClickHouse/issues/52053#issuecomment-1643805521
Seria bom se o PRQL crescesse bastante e se tornasse uma linguagem com suporte de primeira classe no Postgres. A álgebra relacional é linda, mas SQL é um projeto inicial desajeitado que deveria ter sido substituído décadas atrás
Até Codd tinha insatisfações com SQL. O que ele inventou é impressionante, mas aprendemos muito sobre design de linguagens de programação desde então
ORDER BYo conceito central de que relações são conjuntos sem ordemEsse problema aparece quando, ao envolver em uma subconsulta, a ordenação da relação desaparece, o que é bastante inesperado. O modelo de dados do PRQL é muito parecido com o modelo relacional; a grande diferença é que a relação é definida como um array de tuplas, portanto tem ordem. Espero que o PRQL fique conhecido como “linguagem relacional Mk II”
Também existe um plugin para DBeaver [3], que ainda precisa de mais documentação e simplificação de usabilidade, mas com ele também pode ser possível consultar Postgres com PRQL. Por fim, usando o pyprql [4], dá para consultar Postgres em um 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
Para referência, sou contribuidor do PRQL
Na época, achei que era porque eu não sabia o suficiente para entender por que precisava ser assim, mas agora sei que não há motivo para isso. SQL acabou ficando como linguagem natural: mesmo que não faça sentido, não dá para contestar, é só falar. Mas SQL não é linguagem natural, e dá para fazer melhor
Se a principal reclamação sobre SQL é que não dá para mudar a ordem de
SELECT,FROM,WHERE, então, para uma linguagem projetada nos anos 70, ela está até bem boaPor outro lado, o PRQL parece ter bastante ruído arbitrário na sintaxe. Não entendo por que eu deveria preferir
join side:left p=positions (p.id==employees.employee_id)aLEFT JOIN positions AS p ON p.id = employees.employee_idUm modelo como o do PRQL, em que cada etapa de cima para baixo é uma transformação da etapa anterior, faz muito mais sentido. SQL exige um manual de referência, enquanto PRQL parece que você escreve diretamente o que quer que a consulta faça. Dito isso, a sintaxe de join do PRQL é muito ruim; eles deveriam ter mantido palavras-chave explícitas do tipo
left join, e também poderiam ter feito melhor a abreviação de aliases e colunas de junçãoPrimeiro, dentro do mesmo
select, não dá para usar depois uma coluna selecionada anteriormente. Não dá para escrever algo comosome_value * 2 AS some_value_doubleddepois degnarly_calculation AS some_value; é preciso envolver em uma subconsulta. Segundo, não dá para especificar todas as colunas exceto algumas específicas. Quando você precisa trazer um cálculo intermediário de uma subconsulta, mas não o quer na saída final, não dá para dizer algo como* EXCEPT some_value; é preciso listar todas as colunas de saída desejadasOs exemplos escolhidos podem ser casos em que parênteses e vírgulas ajudariam bastante, mas, no contexto da linguagem como um todo, não é tão ruim.
:é usado de forma consistente como argumento nomeado, e=parece ser usado para aliasesjoin, e a primeira palavra da instrução éjoin, deixando mais claro qual é a operação realMesmo como exemplo de chamada de função comum,
foo(bar)é melhor do que “bar to foo()”O PRQL 0.9 acabou de ser lançado há poucas horas, então o timing é bom. As notas de lançamento podem ser vistas aqui: https://github.com/PRQL/prql/releases/tag/0.9.0
Há uma mudança incompatível considerável: a sintaxe de tuplas mudou de
[]para{}. No começo, isso parecia listas, mas com o tempo percebemos que, na verdade, eram tuplas. Como dizem as notas de lançamento, deixar[]livre nos permitirá começar a oferecer suporte a arrays em breve. Para constar, sou contribuidor do PRQLUma limitação do PRQL é que, por design, ele só dá suporte a SELECT. Para inserir/alterar/excluir dados, é preciso voltar ao SQL
O cientista de dados da equipe pode entregar consultas em PRQL, mas, para colocá-las em um pipeline de dados real, será preciso traduzir para SQL. Seria bom se ao menos houvesse suporte a uma funcionalidade limitada, como inserir em uma nova tabela temporária. Algo como
from tracks / filter artist == "Bob Marley" / save bob_marley_tmpinsert/update/deleteque venham no fim do pipeline e recebam o nome da tabela como argumentoUm SQL como
UPDATE counters SET value = value + 1 WHERE name LIKE 'prefix.%'poderia ser escrito em PRQL comofrom counters / filter startswith(name, 'prefix.') / derive { new_value = value + 1 } / select { name, new_value } / update countersUm texto que não pode ficar de fora aqui: “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
O objetivo do PRQL é ser uma ótima linguagem para integrar e construir em cima. Não queremos criar N linguagens para N bancos de dados. Como o PRQL sempre será open source e não vai criar um produto comercial, acho que ele é muito mais viável do que linguagens específicas por banco de dados ou por produto. Sou desenvolvedor do PRQL
Show HN anterior: https://news.ycombinator.com/item?id=31897430
“Show HN: PRQL 0.2 – a better SQL” foi publicado por maximilianroos em 27 de junho de 2022, teve 378 pontos e 161 comentários
Post original em que foi proposto pela primeira vez: https://news.ycombinator.com/item?id=30060784
“PRQL – A proposal for a better SQL” foi publicado por maximilianroos em 24 de janeiro de 2022, teve 650 pontos e 295 comentários
Lembra o KQL da Microsoft: https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/
A sintaxe não é tão importante; o que importa é o que o otimizador faz
Muitos problemas atuais de SQL parecem uma bagagem antiga. Como os motores antigos não lidavam bem com sintaxes modernas, muita gente foi treinada a escrever consultas difíceis de ler, complexas e profundamente aninhadas. Por exemplo, expressões de tabela comuns (CTEs) eram imediatamente materializadas, e por isso proliferava aquele estilo antigo como
SELECT FROM (SELECT FROM (SELECT FROM A JOIN (SELECT ) B ON A.x=B.x)))Graças a melhorias no tratamento de CTEs pelos motores, está ficando cada vez mais fácil escrever consultas compreensíveis e composicionais como
WITH A AS (...), WITH B AS (...), WITH C AS (SELECT y FROM A) SELECT result FROM C WHERE .... Com recursos como funções de janela modernas,SELECT * EXCEPTe funcionalidades mais complexas comoTOP X FOLLOWING, o SQL pode ficar mais simplesNesse cenário, não vejo pequenos aprimoramentos em outra forma sintática, como PRQL, trazendo grandes benefícios. Dá para reescrever como um pipeline que parece imperativo, mas o otimizador pode descartar parte disso. É verdade que há coisas em que o SQL precisa melhorar, mas ainda não vi um argumento convincente para diferenças superficiais ou sintáticas