Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/beenotung/better-sql

Generate sql query from a concise query syntax inspired from EdgeDB and GraphQL
https://github.com/beenotung/better-sql

code-generation query-language sql syntax

Last synced: about 1 month ago
JSON representation

Generate sql query from a concise query syntax inspired from EdgeDB and GraphQL

Awesome Lists containing this project

README

        

# better-sql.ts

Generate sql query from a concise query syntax inspired from [EdgeDB](https://www.edgedb.com/blog/edgedb-1-0) and [GraphQL](https://graphql.org/).

[![npm Package Version](https://img.shields.io/npm/v/better-sql.ts)](https://www.npmjs.com/package/better-sql.ts)

Online Playground: https://better-sql.surge.sh

## Supported Features

- [x] output typical sql query, compatible with mysql, postgres, sqlite, e.t.c.
- [x] automatically add table name on columns if not specified
- [x] inner join with nested `table {fields}`
- [x] left join with nested `table [fields]`
- [x] nested `select` sub-query
- [x] `where` statement
- [x] `having` statement
- [x] `group by` statement
- [x] aggregate function, e.g. `sum(score)`
- [x] `order by` statement
- [x] `limit` and `offset` statement

## TypeScript Signature

```typescript
export function queryToSQL(query: string): string
```

## Usage

```typescript
import { queryToSQL } from 'better-sql.ts'
import { db } from './db'

let keyword = '%script%'
let query = 'select post [...] where title like :keyword'
let sql = queryToSQL(query)
let result = db.query(sql, { keyword })
```

## Example

A query in better-sql:

```sql
select post [
id as post_id
title
author_id
user as author { nickname, avatar } where delete_time is null
type_id
post_type {
name as type
is_hidden
} where is_hidden = 0 or user.is_admin = 1
] where created_at >= :since
and delete_time is null
and title like :keyword
order by created_at desc
limit 25

```

is converted into formatted sql as below:

```sql
select
post.id as post_id
, post.title
, post.author_id
, author.nickname
, author.avatar
, post.type_id
, post_type.name as type
, post_type.is_hidden
from post
inner join user as author on author.id = post.author_id
inner join post_type on post_type.id = post.post_type_id
where author.delete_time is null
and (post_type.is_hidden = 0
or user.is_admin = 1)
and post.created_at >= :since
and post.delete_time is null
and post.title like :keyword
order by
post.created_at desc
limit 25
```

Details refers to [sample.ts](./test/sample.ts) and [lang.spec.ts](./test/lang.spec.ts)

## License

This project is licensed with [BSD-2-Clause](./LICENSE)

This is free, libre, and open-source software. It comes down to four essential freedoms [[ref]](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html#fnref:2):

- The freedom to run the program as you wish, for any purpose
- The freedom to study how the program works, and change it so it does your computing as you wish
- The freedom to redistribute copies so you can help others
- The freedom to distribute copies of your modified versions to others