Все операции с данными опираются на команды языка SQL, про которые подробно можно прочитать в соответствующем руководстве. Тем не менее рассмотрим вкратце базовые операции с бд.
Создадим базу данных на сервере MySQL через Node.js:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", password: "123456" }); connection.query("CREATE DATABASE usersdb2", function(err, results) { if(err) console.log(err); else console.log("База данных создана"); }); connection.end();
В данном случае посредство команды CREATE DATABASE
создается база данных usersdb2.
Теперь добавим в выше созданную базу данныз usersdb2 таблицу:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = `create table if not exists users( id int primary key auto_increment, name varchar(255) not null, age int not null )`; connection.query(sql, function(err, results) { if(err) console.log(err); else console.log("Таблица создана"); }); connection.end();
Для создания таблицы применяется команда CREATE TABLE
, которая создается таблицу users с тремя столбцами - id, name и age.
Для добавления применяется SQL-команда INSERT
. Добавим данные в ранее созданную таблицу users:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = `INSERT INTO users(name, age) VALUES('Sam', 31)`; connection.query(sql, function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
В данном случае в таблицу добавляется одна строка, где столбец name имеет значение "Sam", столбец age - значение 31. С помощью параметра results в функции обратного вызова мы можем получить результаты операции. Например, в моем случае консольный вызов будет следующим:
C:\node\mysqlapp> node app.js ResultSetHeader { fieldCount: 0, affectedRows: 1, insertId: 1, info: '', serverStatus: 2, warningStatus: 0 }
В данном случае мы видим, что возвращается объект, где можно выделить ряд свойств. Прежде всего, это affectedRows - количество затронутых операцией строк (в данном случае количество добавленных строк) и insertId - идентификатор (значение поля id) добавленной записи. Соответственно, если бы нам потребовалось получить id добавленной строки, то мы могли бы написать так:
connection.query(sql, function(err, results) { if(err) console.log(err); console.log(results.insertId); });
Добавим сразу несколько значений:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const users = [ ["Bob", 22], ["Alice", 25], ["Kate", 28] ]; const sql = `INSERT INTO users(name, age) VALUES ?`; connection.query(sql, [users], function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
При добавлении множества объектов в sql-запросе после VALUES
указывается один вопросительный знак.
И при успешном добавлении свойство results.affectedRows
укажет, то добавлено три строки:
C:\node\mysqlapp> node app.js ResultSetHeader { fieldCount: 0, affectedRows: 3, insertId: 3, info: 'Records: 3 Duplicates: 0 Warnings: 0', serverStatus: 2, warningStatus: 0 }
Однако в этом случае следует учитывать, что мы не сможем получить id всех добавленных строк.
Для получения данных применяется sql-команда SELECT
. Например, получим все данные из таблицы users:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = `SELECT * FROM users`; connection.query(sql, function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
Объект results
в функции обратного вызова будет представлять массив полученных из БД данных:
C:\node\mysqlapp> node app.js [ TextRow { id: 1, name: 'Sam', age: 31 }, TextRow { id: 2, name: 'Tom', age: 29 }, TextRow { id: 3, name: 'Bob', age: 22 }, TextRow { id: 4, name: 'Alice', age: 25 }, TextRow { id: 5, name: 'Kate', age: 28 }, TextRow { id: 6, name: 'Tim', age: 22 }, TextRow { id: 7, name: 'Tom', age: 25 }]
Соответственно после получения мы сможем работать с этими данными как с обычным массивом объектов. Например, выведем только имя для каждого пользователя из базы данных:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = "SELECT * FROM users"; connection.query(sql, function(err, results) { if(err) console.log(err); const users = results; for(let i=0; i < users.length; i++){ console.log(users[i].name); } }); connection.end();
Консольный вывод:
C:\node\mysqlapp> node app.js Sam Tom Bob Alice Kate Tim Tom
Выполним фильтрацию данных с применением выражения WHERE
:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = `SELECT * FROM users WHERE name=? AND age=?`; const filter = ["Tom", 29]; connection.query(sql, filter, function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
Здесь запрос фактически будет выглядеть как SELECT * FROM users WHERE name="Tom" AND age=29
, и в прицнипе мы могли бы напрямую ввести
данные в запрос. Однако чтобы избежать sql-инъекций при передаче в запрос данных извне рекомендуется использовать параметризацию.
Для обновления данных применяется sql-команда UPDATE
:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = `UPDATE users SET age=? WHERE name=?`; const data = [34, "Tom"]; connection.query(sql, data, function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
Консольный вывод
C:\node\mysqlapp> node app.js ResultSetHeader { fieldCount: 0, affectedRows: 2, insertId: 0, info: 'Rows matched: 2 Changed: 2 Warnings: 0', serverStatus: 34, warningStatus: 0, changedRows: 2 }
С помощью свойства affectedRows
объекта results мы можем проверить, сколько строк было обновлено.
Для удаления применяется sql-команда DELETE
:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }); const sql = "DELETE FROM users WHERE name=?"; const data = ["Sam"]; // удаляем пользователей с именем Sam connection.query(sql, data, function(err, results) { if(err) console.log(err); console.log(results); }); connection.end();
Консольный вывод:
C:\node\mysqlapp> node app.js ResultSetHeader { fieldCount: 0, affectedRows: 1, insertId: 0, info: '', serverStatus: 34, warningStatus: 0 }