Като начинаещ в Knex.js, наистина ми отнема известно време да проуча функцията за транзакции на Knex.js. Knex.js е лесен инструмент за свързване на интерфейс и база данни. Така че искам да споделя малко опит с някой, който изпитва същия процес като мен. Никога не се предавайте.
Има три части на статията, можете да изберете всяка част, която искате:
- Въведение в Knex
- Основни познания за Knex.js и функцията за транзакции
- Обяснение на кода на транзакция 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.
- Обещание на 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)