Как новичок в Knex.js, мне действительно нужно некоторое время, чтобы изучить функцию транзакций Knex.js. Knex.js — это простой инструмент для подключения внешнего интерфейса и базы данных. Поэтому я хочу поделиться некоторым опытом с кем-то, кто переживает тот же процесс, что и я. Никогда не сдавайся.

Статья состоит из трех частей, вы можете выбрать любую часть:

  1. Введение в Кнекс
  2. Базовые знания Knex.js и функции транзакций
  3. Объяснение кода транзакции 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.

  1. Обещание JS: Одной из особенностей Knex.js является интерфейс обещания для асинхронного управления потоком. Вы будете часто использовать синтаксис обещаний. Вы можете проверить следующую ссылку.
    Обещание (javascript.info)
    Связывание обещаний (javascript.info)
  2. Транзакция 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)

Разница между исходной версией и версией транзакции:

  1. Код исходной версии заключен в knex.transaction(function(trx) {})
  2. Knex в коде исходной версии заменен на trx.

чтобы мы могли воспользоваться функциональностью транзакции.

Поделиться !

Посмотреть и попробовать образец по ссылке: Zoran-yang/knex.tranction-sample (github.com)