Node.js
Integracja MySQL
Szukaj…
Wprowadzenie
W tym temacie nauczysz się integrować z Node.js za pomocą narzędzia do zarządzania bazą danych MYSQL. Poznasz różne sposoby łączenia i interakcji z danymi rezydującymi w mysql za pomocą programu i skryptu nodejs.
Zapytaj obiekt połączenia o parametry
Jeśli chcesz użyć treści SQL wygenerowanej przez użytkownika, należy to zrobić z parametrami. Na przykład, aby wyszukać użytkownika o nazwie aminadav
, powinieneś:
var username = 'aminadav';
var querystring = 'SELECT name, email from users where name = ?';
connection.query(querystring, [username], function(err, rows, fields) {
if (err) throw err;
if (rows.length) {
rows.forEach(function(row) {
console.log(row.name, 'email address is', row.email);
});
} else {
console.log('There were no results.');
}
});
Korzystanie z puli połączeń
za. Uruchamianie wielu zapytań jednocześnie
Wszystkie zapytania w połączeniu MySQL są wykonywane jeden po drugim. Oznacza to, że jeśli chcesz wykonać 10 zapytań, a każde z nich zajmie 2 sekundy, wykonanie całego zadania zajmie 20 sekund. Rozwiązaniem jest utworzenie 10 połączeń i uruchomienie każdego zapytania w innym połączeniu. Można to zrobić automatycznie przy użyciu puli połączeń
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass',
database : 'schema'
});
for(var i=0;i<10;i++){
pool.query('SELECT ` as example', function(err, rows, fields) {
if (err) throw err;
console.log(rows[0].example); //Show 1
});
}
Uruchomi wszystkie 10 zapytań równolegle.
Kiedy korzystasz z pool
, nie potrzebujesz już połączenia. Możesz wysłać zapytanie bezpośrednio do puli. Moduł MySQL wyszuka następne bezpłatne połączenie w celu wykonania zapytania.
b. Osiągnięcie wielu dzierżaw na serwerze bazy danych z hostowanymi na nim różnymi bazami danych.
Wielozadaniowość jest obecnie powszechnym wymogiem aplikacji korporacyjnych i nie jest zalecane tworzenie puli połączeń dla każdej bazy danych na serwerze bazy danych. więc zamiast tego możemy utworzyć pulę połączeń z serwerem bazy danych, a następnie przełączać je między bazami danych hostowanymi na serwerze bazy danych na żądanie.
Załóżmy, że nasza aplikacja ma różne bazy danych dla każdej firmy hostowanej na serwerze bazy danych. Po uzyskaniu dostępu do aplikacji połączymy się z odpowiednią firmową bazą danych. Oto przykład, jak to zrobić:
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass'
});
pool.getConnection(function(err, connection){
if(err){
return cb(err);
}
connection.changeUser({database : "firm1"});
connection.query("SELECT * from history", function(err, data){
connection.release();
cb(err, data);
});
});
Pozwól mi rozbić przykład:
Podczas definiowania konfiguracji puli nie podałem nazwy bazy danych, a jedynie serwer bazy danych, tj
{
connectionLimit : 10,
host : 'example.org',
user : 'bobby',
password : 'pass'
}
więc gdy chcemy użyć konkretnej bazy danych na serwerze bazy danych, prosimy o połączenie z bazą danych za pomocą:
connection.changeUser({database : "firm1"});
możesz zapoznać się z oficjalną dokumentacją tutaj
Połącz się z MySQL
Jednym z najprostszych sposobów połączenia z MySQL jest użycie modułu mysql
. Ten moduł obsługuje połączenie między aplikacją Node.js a serwerem MySQL. Możesz zainstalować go jak każdy inny moduł:
npm install --save mysql
Teraz musisz utworzyć połączenie mysql, które możesz później wyszukać.
const mysql = require('mysql');
const connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'database_schema'
});
connection.connect();
// Execute some query statements
// I.e. SELECT * FROM FOO
connection.end();
W następnym przykładzie dowiesz się, jak wysłać zapytanie do obiektu connection
.
Zapytaj obiekt połączenia bez parametrów
Wysyłasz zapytanie jako ciąg znaków iw odpowiedzi odbierane jest wywołanie zwrotne z odpowiedzią. Oddzwonienie daje error
, tablicę rows
i pól. Każdy wiersz zawiera całą kolumnę zwróconej tabeli. Oto fragment poniższego wyjaśnienia.
connection.query('SELECT name,email from users', function(err, rows, fields) {
if (err) throw err;
console.log('There are:', rows.length,' users');
console.log('First user name is:',rows[0].name)
});
Uruchom wiele zapytań za pomocą jednego połączenia z puli
Mogą wystąpić sytuacje, w których skonfigurujesz pulę połączeń MySQL, ale masz wiele zapytań, które chcesz uruchamiać w kolejności:
SELECT 1; SELECT 2;
Można po prostu uruchomić następnie używając pool.query
jak widać gdzie indziej , ale jeśli masz tylko jedno wolne połączenie w basenie trzeba czekać, aż gra będzie dostępna, zanim będzie można uruchomić drugą kwerendę.
Możesz jednak zachować aktywne połączenie z puli i uruchomić tyle zapytań, ile chcesz, używając pojedynczego połączenia za pomocą pool.getConnection
:
pool.getConnection(function (err, conn) { if (err) return callback(err); conn.query('SELECT 1 AS seq', function (err, rows) { if (err) throw err; conn.query('SELECT 2 AS seq', function (err, rows) { if (err) throw err; conn.release(); callback(); }); }); });
Uwaga: musisz pamiętać o release
połączenia, w przeciwnym razie do reszty puli będzie dostępne jedno połączenie MySQL!
Aby uzyskać więcej informacji na temat łączenia połączeń MySQL, zapoznaj się z dokumentacją MySQL .
Zwraca zapytanie, gdy wystąpi błąd
Możesz dołączyć zapytanie wykonane do obiektu err
gdy wystąpi błąd:
var q = mysql.query('SELECT `name` FROM `pokedex` WHERE `id` = ?', [ 25 ], function (err, result) { if (err) { // Table 'test.pokedex' doesn't exist err.query = q.sql; // SELECT `name` FROM `pokedex` WHERE `id` = 25 callback(err); } else { callback(null, result); } });
Eksportuj pulę połączeń
// db.js
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
module.export = {
getConnection: (callback) => {
return pool.getConnection(callback);
}
}
// app.js
const db = require('./db');
db.getConnection((err, conn) => {
conn.query('SELECT something from sometable', (error, results, fields) => {
// get the results
conn.release();
});
});