Как новичок в Knex.js, мне действительно нужно некоторое время, чтобы изучить функцию транзакций Knex.js. Knex.js — это простой инструмент для подключения внешнего интерфейса и базы данных. Поэтому я хочу поделиться некоторым опытом с кем-то, кто переживает тот же процесс, что и я. Никогда не сдавайся.
Статья состоит из трех частей, вы можете выбрать любую часть:
- Введение в Кнекс
- Базовые знания Knex.js и функции транзакций
- Объяснение кода транзакции Knex.js
Введение в Кнекс
Knex — это мультидиалектный (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (включая аутентификацию Oracle Wallet)) построитель запросов для Node.js. Вы можете манипулировать разнообразным языком SQL с помощью JS-подобного и простого синтаксиса. Даже если вы новичок в SQL, вы можете легко использовать Knex. Вы можете получить больше информации на их веб-сайте SQL Query Builder для Javascript | Knex.js (knexjs.org).
Базовые знания о функции транзакций Knex.js.
Есть две вещи, которые вы должны знать, прежде чем изучать функцию транзакций Knex.js.
- Обещание JS: Одной из особенностей Knex.js является интерфейс обещания для асинхронного управления потоком. Вы будете часто использовать синтаксис обещаний. Вы можете проверить следующую ссылку.
Обещание (javascript.info)
Связывание обещаний (javascript.info) - Транзакция SQL: Вы можете изучить концепцию транзакции по следующей ссылке.
Сделайте свой SQL безопаснее (статья) | Академия Хана
Долгая история короче. О обещании: во-первых, вы можете подключить синтаксис обещания с помощью «.then» или «.catch». «.then» — это следующий шаг, который вы хотите выполнить после успешного завершения обещания. «.catch» предназначен для обработки ошибок. Во-вторых, если «.then» нужен результат последнего шага в качестве периметра, вы должны использовать синтаксис «return» на последнем шаге. Что касается транзакции, весь код в транзакции будет выполняться одновременно, и он отменит весь шаг, если выполнение завершится ошибкой. Транзакция может защитить целостность базы данных.
Пример кода транзакции Knex.js
Исходная версия (без транзакции)
const books = [ {title: 'Canterbury Tales'}, {title: 'Moby Dick'}, {title: 'Hamlet'} ]; knex.insert({name: 'Old Books'}, 'id').into('catalogues') // insert data into "catalogues" table .then(function(ids) { books.forEach((book) => book.catalogue_id = ids[0].id); return knex('books').insert(books); }) // transform array to {title: 'XXX', catalogue_id:XXX } by "forEach" and insert data into "books" table .then(function(inserts) { console.log(inserts.rowCount + ' new books saved.'); res.json(inserts.rowCount + ' new books saved.') }) // show the result "3 new books saved. " .catch(function(error) { console.error(error); }); // error handling Final result title | catalogue_id | id ------------------+--------------+---- Canterbury Tales | 1 | 1 Moby Dick | 1 | 2 Hamlet | 1 | 3 (3 rows) name | id -----------+---- Old Books | 1 (1 row)
Версия транзакции
// Using trx as a query builder: knex.transaction(function(trx) { // wrap whole code in knex.transaction(function(trx) {}) const books = [ {title: 'Canterbury Tales'}, {title: 'Moby Dick'}, {title: 'Hamlet'} ]; return trx // change knex into trx .insert({name: 'Old Books'}, 'id') // insert data into "catalogues" table .into('catalogues') .then(function(ids) { books.forEach((book) => book.catalogue_id = ids[0].id); return trx('books').insert(books); // transform array to {title: 'XXX', catalogue_id:XXX } by "forEach" and insert data into "books" table }); }) .then(function(inserts) { console.log(inserts.rowCount + ' new books saved.'); res.json(inserts.rowCount + ' new books saved.') }) // show the result "3 new books saved. " .catch(function(error) { console.error(error); }); // error handling Final result title | catalogue_id | id ------------------+--------------+---- Canterbury Tales | 1 | 1 Moby Dick | 1 | 2 Hamlet | 1 | 3 (3 rows) name | id -----------+---- Old Books | 1 (1 row)
Разница между исходной версией и версией транзакции:
- Код исходной версии заключен в knex.transaction(function(trx) {})
- Knex в коде исходной версии заменен на trx.
чтобы мы могли воспользоваться функциональностью транзакции.
Поделиться !
Посмотреть и попробовать образец по ссылке: Zoran-yang/knex.tranction-sample (github.com)