Перейти к основному содержимому

Query и Execute — прямые команды в базе данных

Перед началом​

Чтобы как можно эффективнее освоить этот учебный материал, рекомендуем убедиться, что у вас есть базовые знания JavaScript, SQL и что вы умеете создавать сервисы в Netuno.

Если вы не знаете, как создавать сервисы, перейдите к разделу Веб-сервисы REST.

Создание запросов​

Netuno предоставляет функции, предназначенные для создания запросов к базе данных. В этом руководстве мы кратко представим и опишем действие каждой из них, а также рекомендации для получения наилучшего результата.

_db.query('SELECT * FROM ...')​

Эта функция позволяет возвращать данные запроса.

_out.json(
_db.query('SELECT * FROM имя_таблицы')
)

Обратите внимание, что функция _out.json() позволяет просмотреть данные сервиса на экране при вызове его в браузере.

Эта функция также принимает аргументы, которые передаются непосредственно при вызове сервиса. Например, представим, что у нас есть сервис выбрать-все.js; его вызов будет выполняться по адресу http://localhost:9000/services/выбрать-все.netuno, а передаваемые аргументы указываются после вызова, начиная со знака вопроса:

http://localhost:9000/services/выбрать-все.netuno?аргумент1=1&аргумент2=имя

Обратите внимание, что для передачи нескольких аргументов достаточно разделить их амперсандом (&).

Запрос с параметрами​

И наконец, достаточно объявить эту переменную в запросе следующим образом:

_out.json(
_db.query(
'SELECT * FROM имя_таблицы WHERE id = ? AND имя = ?',
_req.getInt("аргумент1"), _req.getString("аргумент2")
)
)

Вместо '?' (знаков вопроса) будет подставлен соответствующий параметр в соответствии с его порядком.

Запрос с параметрами и типами PostgreSQL и H2DataBase​

Однако H2Database и PostgreSQL поддерживают простой синтаксис преобразования, поэтому можно назначать типы параметрам следующим образом:

_out.json(
_db.query(
'SELECT * FROM имя_таблицы WHERE id = ?::int AND имя = ?::varchar',
_req.getInt("id"), _req.getString("имя")
)
)

Типы параметров H2Database и PostgreSQL​

Как можно было заметить ранее, при выполнении запроса с аргументами необходимо определить их тип. Ниже приведён список всех типов переменных и наиболее подходящий тип для каждого из них:

  • Подходит для параметров целых чисел:
    • ?::int
  • Подходит для параметров десятичных чисел:
    • ?::float
  • Подходит для параметров типа глобального/универсального уникального идентификатора, более известного как guid или uuid:
    • ?::uuid
  • Подходит для параметров обычного текста, строк:
    • ?::varchar
    • ?::text
  • Подходит для параметров типа даты:
    • ?::date
  • Подходит для параметров типа времени:
    • ?::time
  • Подходит для параметров с датой и временем:
    • ?::datetime (H2Database)
    • ?::timestamp (PostgreSQL)

_db.execute('INSERT INTO | UPDATE | DELETE ...')​

Эта функция позволяет выполнять команду базы данных, такую как update, insert и delete.

Возвращает количество записей, затронутых выполненной командой.

// Пример Insert:
const количествоВставленныхЗаписей = _db.execute(
"INSERT INTO имя_таблицы(id, активен, имя) " +
"VALUES(nextval('имя_таблицы_id'), ?::int, ?::varchar)",
1, имя
)

// Пример Update:
const количествоОбновлённыхЗаписей = _db.execute(
"UPDATE имя_таблицы SET имя = ?::varchar WHERE id = ?::int",
_req.getString("имя"), _req.getInt("id")
)

// Пример Delete:
const количествоУдалённыхЗаписей = _db.execute(
"DELETE FROM имя_таблицы WHERE id = ?::int",
_req.getInt("id")
)

Примечание: При выполнении insert проверьте, что поле активен равно 1, иначе запись не появится в результате.

Пример взаимодействия с данными​

Теперь представим рекомендуемые правила, которые помогут получить наилучшие возможные результаты.

Первый результат запроса​

Ниже показано, как получить первую строку запроса; результат будет null, если не получено ни одной строки.

// Выбрать данные:
const результатБД = _db.queryFirst(
'SELECT имя FROM имя_таблицы WHERE uid = ?::uuid',
_req.getString("uid")
)
if (!результатБД) {
// Код состояния HTTP:
_header.status(404)
// Указание ошибки:
_out.json(
_val.map()
.set('ошибка', 'id-не-найден')
)
// Завершает выполнение сервиса:
_exec.stop()
}

Проверка количества записей​

Когда вы выполняете выборку из базы данных, результат которой должен быть единственным, для доступа к данным следует действовать следующим образом:

Обратите внимание, что это всего лишь простой пример, который гарантирует возврат как минимум 1 результата и предотвращает ошибку, если результата нет.

// Выборка данных:
var результатыБД = _db.query(
'SELECT имя FROM имя_таблицы WHERE id = ?::int',
_val.init()
.add(_req.getInt("id"))
)
let имя = null;
// Гарантирует наличие данных; можно использовать
// знак «больше» (результатыБД.size() > 1), если
// записей больше одной:
if (результатыБД.size() >= 1) {
// Чтобы напрямую получить значение имени, достаточно:
имя = результатыБД.get(0).getString('имя');
}

Итерация по записям в цикле​

Если результатом выборки являются несколько результатов, можно использовать цикл for, чтобы получить данные следующим образом:

// Выполнить запрос
const результатыБД = _db.query('SELECT id, имя FROM имя_таблицы');

// Инициализировать переменную, чтобы она могла принимать значения
const элементы = _val.init();

// Итерация по всем результатам для получения каждого значения отдельно
for (const результатБД of результатыБД) {
элементы.push(
_val.map()
.set("uid", результатБД.getString("uid"))
.set("имя", результатБД.getString("имя"))
);
}

// Отправляет в вывод данных новый список данных:
_out.json(элементы);

Если у вас возникнут вопросы, не стесняйтесь обращаться; см. указания в нижнем колонтитуле этого сайта.

Удачной разработки!