Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/beenotung/better-sql
- Owner: beenotung
- License: bsd-2-clause
- Created: 2022-07-20T15:28:55.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-03-13T17:53:12.000Z (11 months ago)
- Last Synced: 2024-12-29T02:37:57.551Z (about 2 months ago)
- Topics: code-generation, query-language, sql, syntax
- Language: TypeScript
- Homepage: https://better-sql.surge.sh
- Size: 145 KB
- Stars: 26
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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