top | item 47002261

Show HN: OmniQL – One Query Language for PostgreSQL, MySQL, MongoDB, and Redis

2 points| canu21 | 18 days ago |omniql.com

Hey HN, I built OmniQL — an open-source Go library that compiles a universal query syntax into native database commands.

You write: :GET User WHERE id = 42

It becomes: PostgreSQL → SELECT * FROM "users" WHERE "id" = 42; MongoDB → db.users.find({ id: 42 }); Redis → HGETALL users:42

It's a compiler, not a wrapper. Your query becomes an AST, then translates to native commands. No runtime overhead — it generates the same query you'd write by hand.

Works for DDL too: :CREATE TABLE User WITH id:AUTO, name:STRING:NOTNULL

Becomes native CREATE TABLE for Postgres/MySQL or db.createCollection for MongoDB.

Why I built this: I run a multi-database platform and got tired of maintaining four different query syntaxes. OmniQL started as an internal tool and we're open-sourcing it.

GitHub: https://github.com/omniql-engine/omniql Docs: https://docs.omniql.com

Happy to answer questions about the compiler architecture, AST design, or how we handle the semantic gaps between SQL and NoSQL.

4 comments

order

aerzen|16 days ago

The `:` prefix is an interesting choice. I don't fully understand when it is needed. It seems to always be used at the beginning of the query. But why is it not used before WHERE?

canu21|14 days ago

The : prefix marks OmniQL commands, the action you want to perform (:GET, :CREATE, :DELETE, etc.). It's how the parser distinguishes OmniQL syntax from native SQL or other query languages. WHERE, AND, OR, LIMIT etc. are clauses. They modify the command but aren't commands themselves. So the rule is simple: commands get :, clauses don't. Think of it like a terminal. You prefix the command (git push) but not the flags (--force). Same idea here.