Таблицы и представления - 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».