Ваш поток соединения в порядке.Если вы делаете только 1 запрос, вам на самом деле не нужно выполнять никаких шагов, и вы можете просто вызвать .query()
в пуле напрямую.(Что делает все остальное под капотом).
Ситуация, когда вам нужно сделать несколько запросов в одной транзакции, в основном, но я бы добавил поддержку транзакций:
- создать соединениепул
- Когда вам нужно выполнить много запросов:
- getConnection () из пула
- запуск транзакции
- итерация по элементам, которые требуют запросов
- выполнить запросы
- в случае сбоя, остановить и откатить
- , если все выполнено успешно, зафиксировать
- .release () connection
Youзнать, когда освободить соединение, если все запросы «выполнены».Откуда ты знаешь, что это сделано?Есть несколько способов.Я бы порекомендовал вам использовать API обещаний, поэтому он может выглядеть следующим образом:
async function doStuff(items) {
try {
const connection = await pool.getConnection();
await connection.beginTransaction();
for(const item of items) {
await connection.query('....');
}
await connection.commit();
} catch (e) {
await connection.rollback();
throw e;
} finally {
await connection.release();
}
}
У этого шаблона есть несколько преимуществ:
- Он будет правильно сообщать об ошибках
- Соединение будет разорвано в случае успеха и в случае ошибки.
- Оно либо полностью провалится, либо полностью преуспеет.Здесь нет ничего плохого.
Если вам не нужны транзакции, это можно упростить:
async function doStuff(items) {
try {
const connection = await pool.getConnection();
for(const item of items) {
await connection.query('....');
}
} finally {
await connection.release();
}
}
Проблема в том, что вы можете получить частичные успехи,что часто нежелательно, особенно для API.Однако, если он достаточно хорош для вас, он достаточно хорош.
И если вам удобно не иметь транзакций, вы можете теоретически полностью пропустить шаг getConnection
:
async function doStuff(items) {
for(const item of items) {
await pool.query('....');
}
}
.подразумевается, что все ваши запросы могут выполняться на разных соединениях.Это может дать вам худшую производительность, но делает более простой код.
1049 *
Как получить обещания включен? 1053 * Ну это немного спорно.Для этого вам может понадобиться переключить пакеты mysql.Существует пакет
mysql2
с импортом
mysql2/promise
, который действительно превосходен (и на самом деле делится кодом с более популярным пакетом
mysql
).Очень рекомендуется переключиться на это.
Что, если я не хочу переключать пакеты?
Что ж, версия с обратным вызовом намного более болезненная.В этом случае я бы рекомендовал по-прежнему использовать обещания, но преобразовывать ваши обратные вызовы в шаблон обещания, возможно, используя 'promisify'.
Если вы действительно нигде не хотите получать обещания, вам, в основном, нужно преобразовать мои примеры в callback-на основе, который будет выглядеть намного более болезненным.