forked from hinterland/documentation
docs: reast standart init
This commit is contained in:
@@ -0,0 +1,167 @@
|
|||||||
|
База на которой основанны запросы
|
||||||
|
```mermaid
|
||||||
|
erDiagram
|
||||||
|
PEOPLE ||--|{ ORDERS : "id -> person_id"
|
||||||
|
|
||||||
|
PEOPLE {
|
||||||
|
int id PK
|
||||||
|
string name
|
||||||
|
int age
|
||||||
|
string status
|
||||||
|
boolean active
|
||||||
|
date created_at
|
||||||
|
}
|
||||||
|
|
||||||
|
ORDERS {
|
||||||
|
int id PK
|
||||||
|
int person_id FK
|
||||||
|
date order_date
|
||||||
|
decimal total
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Базовый запрос
|
||||||
|
```http
|
||||||
|
GET /people
|
||||||
|
```
|
||||||
|
|
||||||
|
Вернёт все доступные записи таблицы.
|
||||||
|
|
||||||
|
# Фильтры и условия
|
||||||
|
```http
|
||||||
|
GET /people?колонка=оператор.значение
|
||||||
|
```
|
||||||
|
|
||||||
|
## Основные операторы
|
||||||
|
- `eq` — равно `?age=eq.20`
|
||||||
|
- `gt` / `gte` — больше / больше либо равно `?age=gt.18`
|
||||||
|
- `neq` — не равно `?age=neq.20`
|
||||||
|
- `lt` / `lte` — меньше / меньше либо равно `?age=lt.65`
|
||||||
|
- `like` / `ilike` — шаблон (регистр учитывается / не учитывается) `?name=ilike.*alex*`
|
||||||
|
- `in` — входит в набор `?id=in.(1,2,3)`
|
||||||
|
- `not.in` — не входит в набор `?id=not.in.(1,2,3)`
|
||||||
|
- `match` / `imatch` — [patern matching documentation](https://www.postgresql.org/docs/current/functions-matching.html)
|
||||||
|
- `isdistinct` - !=, но можно использовать с NULL `?age=neq.null`
|
||||||
|
- `is` — проверка на NULL (или true/false) `?status=is.null` / `?active=is.true`
|
||||||
|
|
||||||
|
## Логические операторы (объединение)
|
||||||
|
- `and` — несколько условий вместе
|
||||||
|
`?and=(status.eq.active,age.gt.18)`
|
||||||
|
- `or` — логическое «или»
|
||||||
|
`?or=(name.eq.John,name.eq.Mike)`
|
||||||
|
- `all`
|
||||||
|
|
||||||
|
## Поноценный поиск по тексту
|
||||||
|
<!-- TODO: нормальное описание -->
|
||||||
|
- `fts` - по по...
|
||||||
|
- `plfts` - поиск по по тексту
|
||||||
|
- `phfts` - поиск по фразам
|
||||||
|
- `wfts` - поиск по словам
|
||||||
|
|
||||||
|
# Селекторы (выбор колонок)
|
||||||
|
```http
|
||||||
|
GET /people?select=id,name,age
|
||||||
|
```
|
||||||
|
Вернёт только указанные колонки.
|
||||||
|
|
||||||
|
## Переименование полей
|
||||||
|
```http
|
||||||
|
GET /people?select=person_id:id,person_name:name
|
||||||
|
```
|
||||||
|
Вернёт указанные колонки с указанными именами.
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"person_id": null,
|
||||||
|
"person_name": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Многоуровневый селект
|
||||||
|
Если есть связь, например `people` → `orders` (по `people.id = orders.person_id`), то:
|
||||||
|
```http
|
||||||
|
GET /people?select=id,name,orders(*)
|
||||||
|
```
|
||||||
|
Вернёт людей вместе со всеми их заказами.
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": null,
|
||||||
|
"name": null,
|
||||||
|
"orders": [
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
```http
|
||||||
|
GET /people?order=id,total,person(id, name)
|
||||||
|
```
|
||||||
|
Вернёт заказы вместе с заказчиками.
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": null,
|
||||||
|
"total": null,
|
||||||
|
"person": {
|
||||||
|
"id": null,
|
||||||
|
"name": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
```http
|
||||||
|
GET /people?order=id,total,...person(name)
|
||||||
|
```
|
||||||
|
Вернёт заказ встроив поля заказчика на верхний уровень.
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": null,
|
||||||
|
"total": null,
|
||||||
|
"name": null
|
||||||
|
}
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
# Сортировка
|
||||||
|
```http
|
||||||
|
GET /people?order=age.desc
|
||||||
|
```
|
||||||
|
Сортировка по колонке `age` в обратном порядке.
|
||||||
|
Может быть цепочка: `?order=age.desc,name.asc`
|
||||||
|
|
||||||
|
# Лимиты и сдвиги
|
||||||
|
```http
|
||||||
|
GET /people?limit=10&offset=20
|
||||||
|
```
|
||||||
|
Вернёт 10 записей начиная с 21-й.
|
||||||
|
|
||||||
|
# Агрегации
|
||||||
|
Для агрегаций есть расширенный синтаксис:
|
||||||
|
|
||||||
|
- `count=exact` вернёт общее кол-во строк в заголовке `Content-Range`.
|
||||||
|
- `Prefer: count=exact` в заголовке запроса даёт то же самое.
|
||||||
|
|
||||||
|
## Пример: агрегированные поля
|
||||||
|
<!-- TODO: -->
|
||||||
|
|
||||||
|
# Пример комбинированного запроса
|
||||||
|
Вернуть людей:
|
||||||
|
|
||||||
|
- Только id, name.
|
||||||
|
- Возраст > 18.
|
||||||
|
- Отсортировать по убыванию по created_at.
|
||||||
|
- Вернуть не более 5 записей.
|
||||||
|
|
||||||
|
```http
|
||||||
|
GET /people
|
||||||
|
?select=id,name
|
||||||
|
&age=gt.18
|
||||||
|
&order=created_at.desc
|
||||||
|
&limit=5
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user