Като начинаещ в Knex.js, наистина ми отнема известно време да проуча функцията за транзакции на Knex.js. Knex.js е лесен инструмент за свързване на интерфейс и база данни. Така че искам да споделя малко опит с някой, който изпитва същия процес като мен. Никога не се предавайте.

Има три части на статията, можете да изберете всяка част, която искате:

  1. Въведение в Knex
  2. Основни познания за Knex.js и функцията за транзакции
  3. Обяснение на кода на транзакция Knex.js

Въведение в Knex

Knex е многодиалектен (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (включително Oracle Wallet Authentication)) инструмент за създаване на заявки за 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)