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(элементы);
Если у вас возникнут вопросы, не стесняйтесь обращаться; см. указания в нижнем колонтитуле этого сайта.
Удачной разработки!