Таблицы и представления - dml

XDAC позволяет проводить операции чтения, записи, обновления и удаления данных в таблицах и представлениях с помощью http-запросов соответствующего типа.

Запросы dml имеют следующий формат:

http://localhost:8887/xdac/datasource_name/dml/schema.table_or_view?operators

Например:

curl "http://localhost:8887/xdac/pg_db/dml/api.t_clients?age=in.(35,39)"

Примечание

для указания схемы или пакета, содержащего таблицу или представление, необходимо использовать классическую форму записи через символ точки: схема.имя_таблицы

SELECT

Для чтения данных из таблицы или представления (SELECT FROM) необходимо выполнить GET-запрос к эндпоинту источника данных с указанием имени таблицы или представления:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients"

По умолчанию сервис возвращает данные в формате NDJSON (Newline Delimited JSON) с использованием HTTP Chunked Transfer Encoding.

Каждая строка ответа содержит один валидный JSON-объект, завершающийся символом новой строки (n).

Данные отправляются по мере их чтения из базы данных.

Пример ответа:

HTTP/1.1 200 OK
Content-Type: application/x-ndjson
Transfer-Encoding: chunked

{"age":78,"birthdate":"1986-02-27T00:00:00Z","description":"B","first_name":"АЛЕКСЕЙ","id":2767,"last_name":"ЕМЕЛЬЯНОВ","salary":41622.90,"second_name":"ЕВГЕНЬЕВИЧ"}
{"age":64,"birthdate":"1965-11-03T00:00:00Z","description":"D","first_name":"ЮЛИЯ","id":2769,"last_name":"ЛОГУНОВА","salary":86158.23,"second_name":"МИХАЙЛОВНА"}
{"age":42,"birthdate":"1997-11-07T00:00:00Z","description":"y","first_name":"АНДРЕЙ","id":2777,"last_name":"БЕТТ","salary":90502.28,"second_name":"АНАТОЛЬЕВИЧ"}

Для выбора конкретных колонок необходимо использовать оператор select с перечислением имен необходимых колонок, например:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients?select=age,first_name"

Пример ответа:

HTTP/1.1 200 OK
Content-Type: application/x-ndjson
Transfer-Encoding: chunked

{"age":78,"first_name":"АЛЕКСЕЙ"}
{"age":64,"first_name":"ЮЛИЯ"}
{"age":42,"first_name":"АНДРЕЙ"}

XDAC позволяет фильтровать результирующие строки, добавляя условия по столбцам с помощью специальных операторов.

Например, чтобы вернуть данные о людях младше 18 лет:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients?age=lt.18"

Также можно задавать несколько условий по столбцам, добавляя дополнительные параметры в строку запроса через символ &.

Например, чтобы вернуть людей, которым больше 18 лет и у которых зарплата больше 50000:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients?age=gt.18&salary=gt.50000"

Формат ответа

С помощью заголовка X-Format можно указать формат ответа для выбранных данных.

Отсутствие заголовка, либо заголовок «X-Format: json» определяет ответ в формате NDJSON (Newline Delimited JSON) с использованием HTTP Chunked Transfer Encoding.

Также доступна возможность выгрузки данных в формат *.CSV, с помощью заголовка «X-Format: csv».

Первая строка выходного файла будет содержать имя колонок, остальные строки - данные. В качестве разделителя используется «;».

Пример запроса для экспорта данных в CSV:

curl -s http://localhost:8888/xdac/pg_db/dml/t_clients \
-H "X-Format: csv" \
-o clients.csv

DML - операторы

Оператор eq

Значение: равно

Аналог PostgreSQL: =

Пример: id=eq.2770


Оператор gt

Значение: больше

Аналог PostgreSQL: >

Пример: date_of_birth=gt.1989-01-01


Оператор ge

Значение: больше или равно

Аналог PostgreSQL: >=

Пример: age=ge.35


Оператор lt

Значение: меньше

Аналог PostgreSQL: <

Пример: age=lt.35


Оператор le

Значение: меньше или равно

Аналог PostgreSQL: <=

Пример: age=le.35


Оператор neq

Значение: не равно

Аналог PostgreSQL: <> или !=

Пример: age=neq.35


Оператор like

Значение: оператор LIKE (для избежания URL-кодирования в шаблоне нужно использовать * как псевдоним символа %)

Аналог PostgreSQL: LIKE

Пример: name=like.Us*


Оператор ilike

Значение: оператор ILIKE (регистронезависимый аналог LIKE; * также заменяет %)

Аналог PostgreSQL: ILIKE

Пример: name=like.us*


Оператор in

Значение: значение из списка, например: ?a=in.(1,2,3). Поддерживает запятые в кавычках: ?a=in.(«привет,мир»,»да,вы»)

Аналог PostgreSQL: IN

Пример: age=in.(33,36,37,38)


Оператор is

Значение: проверка на соответствие состоянию: null, not_null, true, false, unknown

Аналог PostgreSQL: IS

Пример: is_active=is.true  salary=is.null


Оператор not

Значение: отрицание другого оператора

Аналог PostgreSQL: NOT

Пример: age=not.eq.40


Оператор or

Значение: логическое ИЛИ

Аналог PostgreSQL: OR

Пример: or=(age.lt.18,age.gt.21)


Оператор and

Значение: логическое И

Аналог PostgreSQL: AND

Пример: and=(balance.gt.500,balance.lt.1500)

INSERT

Для записи данных в таблицу необходимо выполнить POST-запрос к эндпоинту источника данных с указанием имени таблицы и массивом добавляемых данных в JSON.

Например:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients" -X POST -H "Content-Type: application/json" \
  -d @- << EOF
  [
    {"age":77,"birthdate":"1986-02-27T00:00:00Z","description":"insert by xdac","first_name":"Имя", last_name":"Фамилия","salary":41622.90,"second_name":"Отчество"},
    {"age":7,"birthdate":"2026-02-27T00:00:00Z","description":"insert by xdac","first_name":"Имя2", last_name":"Фамилия2","salary":4.90,"second_name":"Отчество2"},
  ]
EOF

При успешном выполнении запроса сервис вернет код 201, а иначе - ошибку.

UPDATE

Для изменения данных в таблице (UPDATE) необходимо выполнить PATCH или PUT-запрос к эндпоинту источника данных с указанием имени таблицы, массивом обновляемых данных в JSON и набором операторов.

Например обновление first_name и last_name для строк с id == 1:

curl -X PATCH "http://localhost:8887/xdac/pg_db/dml/t_clients?id=eq.1" -H "Content-Type: application/json" \
  -d '{
    "first_name": "John",
    "last_name": "Doe"
  }'

При успешном выполнении запроса сервис вернет код 200, а иначе - ошибку.

DELETE

Для удаления данных в таблице или представлении (DELETE) необходимо выполнить DELETE-запрос к эндпоинту источника данных с указанием имени таблицы и набором операторов.

Например удаление строк с id > 2770:

curl "http://localhost:8887/xdac/pg_db/dml/t_clients?id=gt.2770" -X DELETE

При успешном выполнении запроса сервис вернет код 200, а иначе - ошибку.

Примечание

По умолчанию dml-операции возваращают только код возврата или ошибку, для получения количество затронутых изменениями строк (affected rows) необходимо в запросе указать заголовок: «Prefer: return=representation».