Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wroge/querify
query json-compatible data using a SQL-like language
https://github.com/wroge/querify
json query sql
Last synced: 2 months ago
JSON representation
query json-compatible data using a SQL-like language
- Host: GitHub
- URL: https://github.com/wroge/querify
- Owner: wroge
- License: mit
- Created: 2022-02-26T09:06:07.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-03-21T16:32:34.000Z (almost 3 years ago)
- Last Synced: 2024-06-20T01:55:55.178Z (7 months ago)
- Topics: json, query, sql
- Language: Go
- Homepage:
- Size: 17.6 KB
- Stars: 8
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white)](https://pkg.go.dev/github.com/wroge/querify)
[![Go Report Card](https://goreportcard.com/badge/github.com/wroge/querify)](https://goreportcard.com/report/github.com/wroge/querify)
![golangci-lint](https://github.com/wroge/querify/workflows/golangci-lint/badge.svg)
[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/wroge/querify.svg?style=social)](https://github.com/wroge/querify/tags)# querify
Query your data from and to any json compatible source.
The query language used is similar to SQL with Postgres dialect.```go
hobbiesTable := []map[string]interface{}{
{"id": 1, "name": "Football"},
{"id": 2, "name": "Basketball"},
{"id": 3, "name": "Hockey"},
}usersTable := []map[string]interface{}{
{"id": 1, "name": "Max"},
{"id": 2, "name": "Tom"},
{"id": 3, "name": "Alex"},
}userHobbiesTable := []map[string]interface{}{
{"user_id": 1, "hobby_id": 1},
{"user_id": 1, "hobby_id": 2},
{"user_id": 2, "hobby_id": 3},
{"user_id": 3, "hobby_id": 1},
}type User struct {
Name string
Hobbies []string
}var users []User
err := querify.From(usersTable).As("users").
Join(
querify.LeftJoin{
Right: querify.From(userHobbiesTable).As("user_hobbies"),
On: querify.Equals{querify.Ident("users.id"), querify.Ident("user_hobbies.user_id")},
},
querify.LeftJoin{
Right: querify.From(hobbiesTable).As("hobbies"),
On: querify.Equals{querify.Ident("hobbies.id"), querify.Ident("user_hobbies.hobby_id")},
},
).
GroupBy(querify.Ident("users.name")).
Select(
querify.As{
Name: "name",
Expression: querify.Ident("users.name"),
},
querify.As{
Name: "hobbies",
Expression: querify.ArrayAgg{
Expression: querify.Ident("hobbies.name"),
},
},
).Scan(&users)
if err != nil {
panic(err)
}fmt.Println(users)
// [{Max [Football Basketball]} {Tom [Hockey]} {Alex [Football]}]
```## Features
- Expression:
- Literal
- Ident
- ArrayAgg
- Concat
- CountAll
- Count
- As
- GroupBy:
- Ident
- Cube
- GroupingSets
- Condition:
- And
- Or
- Equals
- Greater
- Less
- OrderBy:
- Asc
- Desc
- Join:
- LeftJoin
- Limit
- OffsetYour required SQL feature isn't yet supported?
Implement these [interfaces](https://github.com/wroge/querify/blob/master/interface.go) and create a merge request!## Dependencies
- [tidwall/gjson](https://github.com/tidwall/gjson)