prql VS libpg_query

Compare prql vs libpg_query and see what are their differences.

prql

PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement (by PRQL)

libpg_query

C library for accessing the PostgreSQL parser outside of the server environment (by pganalyze)
Our great sponsors
  • WorkOS - The modern identity platform for B2B SaaS
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • SaaSHub - Software Alternatives and Reviews
prql libpg_query
106 13
9,427 1,068
2.7% 2.4%
9.9 8.8
5 days ago 1 day ago
Rust C
Apache License 2.0 BSD 3-clause "New" or "Revised" License
The number of mentions indicates the total number of mentions that we've tracked plus the number of user suggested alternatives.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.

prql

Posts with mentions or reviews of prql. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-03-30.
  • Prolog language for PostgreSQL proof of concept
    7 projects | news.ycombinator.com | 30 Mar 2024
  • SQL is syntactic sugar for relational algebra
    2 projects | news.ycombinator.com | 23 Mar 2024
    > I completely attribute this to SQL being difficult or "backwards" to parse. I mean backwards in the way that in SQL you start with what you want first (the SELECT) rather than what you have and widdling it down.

    > The turning point for me was to just accept SQL for what it is.

    Or just write PRQL and compile it to SQL

    https://github.com/PRQL/prql

  • Transpile Any SQL to PostgreSQL Dialect
    7 projects | news.ycombinator.com | 18 Mar 2024
  • Show HN: Open-source, browser-local data exploration using DuckDB-WASM and PRQL
    11 projects | news.ycombinator.com | 15 Mar 2024
    Hey HN! We’ve built Pretzel, an open-source data exploration and visualization tool that runs fully in the browser and can handle large files (200 MB CSV on my 8gb MacBook air is snappy). It’s also reactive - so if, for example, you change a filter, all the data transform blocks after it re-evaluate automatically. You can try it here: https://pretzelai.github.io/ (static hosted webpage) or see a demo video here: https://www.youtube.com/watch?v=73wNEun_L7w

    You can play with the demo CSV that’s pre-loaded (GitHub data of text-editor adjacent projects) or upload your own CSV/XLSX file. The tool runs fully in-browser—you can disconnect from the internet once the website loads—so feel free to use sensitive data if you like.

    Here’s how it works: You upload a CSV file and then, explore your data as a series of successive data transforms and plots. For example, you might: (1) Remove some columns; (2) Apply some filters (remove nulls, remove outliers, restrict time range etc); (3) Do a pivot (i.e, a group-by but fancier); (4) Plot a chart; (5) Download the chart and the the transformed data. See screenshot: https://imgur.com/a/qO4yURI

    In the UI, each transform step appears as a “Block”. You can always see the result of the full transform in a table on the right. The transform blocks are editable - for instance in the example above, you can go to step 2, change some filters and the reactivity will take care of re-computing all the cells that follow, including the charts.

    We wanted Pretzel to run locally in the browser and be extremely performant on large files. So, we parse CSVs with the fastest CSV parser (uDSV: https://github.com/leeoniya/uDSV) and use DuckDB-Wasm (https://github.com/duckdb/duckdb-wasm) to do all the heavy lifting of processing the data. We also wanted to allow for chained data transformations where each new block operates on the result of the previous block. For this, we’re using PRQL (https://prql-lang.org/) since it maps 1-1 with chained data transform blocks - each block maps to a chunk of PRQL which when combined, describes the full data transform chain. (PRQL doesn’t support DuckDB’s Pivot statement though so we had to make some CTE based hacks).

    There’s also an AI block: This is the only (optional) feature that requires an internet connection but we’re working on adding local model support via Ollama. For now, you can use your own OpenAI API key or use an AI server we provide (GPT4 proxy; it’s loaded with a few credits), specify a transform in plain english and get back the SQL for the transform which you can edit.

    Our roadmap includes allowing API calls to create new columns; support for an SQL block with nice autocomplete features, and a Python block (using Pyodide to run Python in the browser) on the results of the data transforms, much like a jupyter notebook.

    There’s two of us and we’ve only spent about a week coding this and fixing major bugs so there are still some bugs to iron out. We’d love for you to try this and to get your feedback!

  • Pql, a pipelined query language that compiles to SQL (written in Go)
    6 projects | news.ycombinator.com | 28 Feb 2024
    > Looks like PRQL doesn't have a Go library so I guess they just really wanted something in Go?

    There's some C bindings and the example in the README shows integration with Go:

    https://github.com/PRQL/prql/tree/main/prqlc/bindings/prqlc-...

  • FLaNK Stack 26 February 2024
    50 projects | dev.to | 26 Feb 2024
  • FLaNK Stack Weekly 19 Feb 2024
    50 projects | dev.to | 19 Feb 2024
  • PRQL as a DuckDB Extension
    3 projects | news.ycombinator.com | 25 Jan 2024
    Can someone tell me why PRQL is better? I went here: https://github.com/PRQL/prql

    It looks nice, but what's the strengths compared to SQL?

  • Shouldn't FROM come before SELECT in SQL?
    2 projects | news.ycombinator.com | 25 Jan 2024
    PRQL [1] is a compile-to-SQL relational querying language that puts FROM first.

    [1] https://prql-lang.org

  • Vanna.ai: Chat with your SQL database
    13 projects | news.ycombinator.com | 14 Jan 2024
    https://prql-lang.org/ might be an answer for this. As a cross-database pipelined language, it would allow RAG to be intermixed with the query, and the syntax may(?) be more reliable to generate

libpg_query

Posts with mentions or reviews of libpg_query. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-03-18.
  • Transpile Any SQL to PostgreSQL Dialect
    7 projects | news.ycombinator.com | 18 Mar 2024
    This in combination with [pg_query](https://github.com/pganalyze/libpg_query) could be a very powerful combination that allows writing generic static analyzers.
  • Postgres: The Next Generation
    4 projects | news.ycombinator.com | 10 Oct 2023
    It's true that the core PG code isn't written in a modular way that's friendly to integration piecemeal in other projects (outside of libpq).

    For THIS PARTICULAR case, the pganalyze team has actually extracted out the parser of PG for including in your own projects:

    https://github.com/pganalyze/libpg_query

  • SQLedge: Replicate Postgres to SQLite on the Edge
    9 projects | news.ycombinator.com | 9 Aug 2023
    #. SQLite WAL mode

    From https://www.sqlite.org/isolation.html https://news.ycombinator.com/item?id=32247085 :

    > [sqlite] WAL mode permits simultaneous readers and writers. It can do this because changes do not overwrite the original database file, but rather go into the separate write-ahead log file. That means that readers can continue to read the old, original, unaltered content from the original database file at the same time that the writer is appending to the write-ahead log

    #. superfly/litefs: aFUSE-based file system for replicating SQLite https://github.com/superfly/litefs

    #. sqldiff: https://www.sqlite.org/sqldiff.html https://news.ycombinator.com/item?id=31265005

    #. dolthub/dolt: https://github.com/dolthub/dolt

    > Dolt can be set up as a replica of your existing MySQL or MariaDB database using standard MySQL binlog replication. Every write becomes a Dolt commit. This is a great way to get the version control benefits of Dolt and keep an existing MySQL or MariaDB database.

    #. pganalyze/libpg_query: https://github.com/pganalyze/libpg_query :

    > C library for accessing the PostgreSQL parser outside of the server environment

    #. Ibis + Substrait [ + DuckDB ]

    > ibis strives to provide a consistent interface for interacting with a multitude of different analytical execution engines, most of which (but not all) speak some dialect of SQL.

    > Today, Ibis accomplishes this with a lot of help from `sqlalchemy` and `sqlglot` to handle differences in dialect, or we interact directly with available Python bindings (for instance with the pandas, datafusion, and polars backends).

    > [...] `Substrait` is a new cross-language serialization format for communicating (among other things) query plans. It's still in its early days, but there is already nascent support for Substrait in Apache Arrow, DuckDB, and Velox.

    #. benbjohnson/postlite: https://github.com/benbjohnson/postlite

    > postlite is a network proxy to allow access to remote SQLite databases over the Postgres wire protocol. This allows GUI tools to be used on remote SQLite databases which can make administration easier.

    > The proxy works by translating Postgres frontend wire messages into SQLite transactions and converting results back into Postgres response wire messages. Many Postgres clients also inspect the pg_catalog to determine system information so Postlite mirrors this catalog by using an attached in-memory database with virtual tables. The proxy also performs minor rewriting on these system queries to convert them to usable SQLite syntax.

    > Note: This software is in alpha. Please report bugs. Postlite doesn't alter your database unless you issue INSERT, UPDATE, DELETE commands so it's probably safe. If anything, the Postlite process may die but it shouldn't affect your database.

    #. > "Hosting SQLite Databases on GitHub Pages" (2021) re: sql.js-httpvfs, DuckDB https://news.ycombinator.com/item?id=28021766

    #. awesome-db-tools https://github.com/mgramin/awesome-db-tools

  • Show HN: Postgres Language Server
    21 projects | news.ycombinator.com | 6 Aug 2023
    Generally I agree that this would be great to have, and Postgres does have a set of libraries it already maintains as part of the main source tree (i.e. libpq, etc), and there is a shared set of code between the backend and the "frontend" (https://github.com/postgres/postgres/tree/master/src/common). So theoretically you could imagine the parser moving into that shared code portion, sharing code but not necessarily requiring linking to a library from the backend.

    However, the challenge from what I've understood from past conversations with some folks working on Postgres core is that the parser is currently heavily tied into the backend - note the parser isn't just the scan.l/gram.y file, but also the raw parse node structs that it outputs. You can see how many files we pull in from the main tree that are prefixed with "src_backend": https://github.com/pganalyze/libpg_query/tree/15-latest/src/...

    Further, there isn't a canonical way to output node trees into a text format today in core, besides the rather hard to work with output of debug_print_parse - there have been discussions on -hackers to potentially utilize JSON here, which may make this a bit easier. Note that in libpg_query we currently use Protobuf (but used to use JSON), which does have the benefit of getting auto-generated structs in the language bindings - but Protobuf is not used in core Postgres at all today.

    All in all, I think there is some upstream interest, but its not clear that this is a good idea from a maintainability perspective.

  • Show HN: PgMagic – a Mac Postgres client that lets you query in natural language
    1 project | news.ycombinator.com | 14 Jun 2023
    Neat project!

    Just in case its helpful to you, I (together with colleagues at pganalyze) maintain pg_query, which packages the Postgres parser as a library: https://github.com/pganalyze/libpg_query

    Might be useful to include in your product as a way to run a quick syntax check on the query output by the LLM, without actually connecting to the database and causing an error in the logs.

  • Show HN: PRQL – A Proposal for a Better SQL
    15 projects | news.ycombinator.com | 24 Jan 2022
    I like that everyone is trying to make something like SQL that reads more naturally to them. More alternatives is good! SQL is a widely accepted standard, and has strictly defined and super broadly accepted semantics.

    As someone who has written quite a few half-baked-for-general-use but fit-for-purpose SQL generator utilities over the years, I'll suggest that if you intend for a novel syntax to be a general SQL replacement then being isomorphic to SQL would massively increase usefulness and uptake:

    1. novel syntax to SQL; check! Now novel syntax works with all the databases!

    2. any valid SQL to novel syntax; a bit harder, but I'd start by using a SQL parser like https://github.com/pganalyze/libpg_query and translating the resulting AST into the novel syntax.

    3. novel syntax to SQL back to novel syntax is idempotent; a nice side effect is a validator/formatter for "novel syntax"

    4. SQL to novel syntax back to SQL is idempotent; a nice side effect is a validator/formatter for SQL, which would be awesome. (See also https://go.dev/blog/gofmt, which is where I learned this "round trip as formatter" trick.)

    I don't mean for this to sound negative, and I know that 2, 3, and 4 are kind of hard. Thank you for building prql!

  • Go PL/SQL parser using ANTLRv4
    2 projects | /r/databasedevelopment | 10 Jan 2022
    I feel like https://github.com/pganalyze/libpg_query should be the default choice for anything that needs a SQL parser. PL/SQL parsing is included there.
  • Postguard: CORS-like permissions for Postgres
    2 projects | /r/PostgreSQL | 21 Oct 2021
    Rules are enforced by parsing statements into a syntax tree and checking all of the nodes against the provided rules. Statement parsing is done through bindings to the excellent libpg_query library, which uses Postgres's own statement parser to generate the syntax tree.
  • Open Source SQL Parsers
    17 projects | dev.to | 8 Oct 2021
    libpg_query extracts the parser (written in C) from the postgres project and packages it as a stand-alone library. This library is wrapped in other languages by other projects like:

What are some alternatives?

When comparing prql and libpg_query you can also consider the following projects:

malloy - Malloy is an experimental language for describing data relationships and transformations.

ANTLR - ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files.

Preql - An interpreted relational query language that compiles to SQL.

JSqlParser - JSqlParser parses an SQL statement and translate it into a hierarchy of Java classes. The generated hierarchy can be navigated using the Visitor Pattern

bustub - The BusTub Relational Database Management System (Educational)

pglast - PostgreSQL Languages AST and statements prettifier: master branch covers PG10, v2 branch covers PG12, v3 covers PG13, v4 covers PG14, v5 covers PG15, v6 covers PG16

tresql - Shorthand SQL/JDBC wrapper language, providing nested results as JSON and more

pg_parse - PostgreSQL parser for Rust that uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parse tree.

spyql - Query data on the command line with SQL-like SELECTs powered by Python expressions

pg_query - Ruby extension to parse, deparse and normalize SQL queries using the PostgreSQL query parser

toydb - Distributed SQL database in Rust, written as a learning project

Apache Calcite - Apache Calcite