Содержание
В большинстве своем интерактивные архитектуры веб-сайтов предполагают генерацию или выдачу данных того или иного рода. Вы, конечно, можете использовать HTML-формы для сбора пользовательских данных. Но тот вид веб-формы, который описан здесь (https://www.freecodecamp.org/news/creating-html-forms/), поможет вам только в одном случае.
На самом деле нам нужен способ надежного хранения и манипулирования данными в среде приложения.
В этой статье я покажу вам, как подключить базу данных к процессу сбора данных. План состоит в том, чтобы бросить немного HTML, JavaScript и крошечный движок базы данных SQLite в миску, энергично перемешать и посмотреть, что получится.
Эта статья взята из моего курса Complete LPI Web Development Essentials Study Guide. Если хотите, можете посмотреть видеоверсию здесь:
Как вы, возможно, уже знаете, SQL в SQLite означает структурированный язык запросов. Это означает, что синтаксис, который вы будете использовать для работы с базой данных SQLite, будет очень похож на то, как вы будете работать с такими базами данных, как MariaDB, Amazon Aurora, Oracle или Microsoft’s SQL Server. Если у вас есть опыт работы с любой из этих баз данных, вы будете чувствовать себя здесь как дома.
Почему мы будем использовать SQLite? Потому что это очень популярный выбор для той работы, которую вы, скорее всего, будете выполнять в веб-среде.
Вам нужно будет создать новый каталог на вашей машине, а также несколько файлов с кодом JavaScript. Мы научимся создавать, изменять и удалять записи в базе данных SQLite.
Конечно, я мог бы объединить все эти действия в одном файле, но, думаю, разбив их на несколько файлов, будет легче понять, что происходит.
Подключение к базе данных и создание таблицы
Вот как будет выглядеть первый файл:
const sqlite3 = require('sqlite3').verbose();
// Создаем/подключаемся к базе данных
const db = new sqlite3.Database('mydatabase.db');
// Создаем таблицу
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
возраст INTEGER
)`);
// Вставка данных
const insertQuery = `INSERT INTO users (name, age) VALUES (?, ?)`;
const name = 'Trevor';
const age = 5;
db.run(insertQuery, [name, age], function (err) {
if (err) {
console.error(err.message);
} else {
console.log(`Inserted data with id ${this.lastID}`);
}
});
// Закройте соединение с базой данных
db.close();
Мы начинаем с загрузки модуля sqlite3 под именем sqlite3, а затем создаем переменную db для представления нашего нового экземпляра базы данных. База данных будет называться mydatabase.db.
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('mydatabase.db');
Если в нашей локальной директории нет базы данных с таким именем, код создаст ее, в противном случае он просто подключится к той, которая уже есть.
Поскольку это наш первый запуск, я создам новую таблицу в базе данных mydatabase.db. В нашей таблице будет три ключа: id, name и age.
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
имя TEXT,
возраст INTEGER
)`);
Как вы видите, id будет первичным ключом, который мы будем использовать для ссылки на отдельные записи.
Мы определили тип данных каждого ключа: целое число, текст и, опять же, целое число. Это определение нужно сделать только один раз. Но мы хотим, чтобы оно было правильным, потому что изменить его позже, после того как мы уже добавили данные, может быть непросто.
Вставка новых данных в таблицу
В этом разделе мы добавим новую запись в таблицу с помощью команды SQL INSERT.
const insertQuery = `INSERT INTO users (name, age) VALUES (?, ?)`;
const name = 'Trevor';
const age = 5;
db.run(insertQuery, [name, age], function (err) {
if (err) {
console.error(err.message);
} else {
console.log(`Inserted data with id ${this.lastID}`);
}
});
Вы, вероятно, обнаружите, что в официальной документации по SQL ключевые синтаксические термины, такие как INSERT и SELECT, всегда пишутся с заглавной буквы. Это полезная практика, но на самом деле она не обязательна. Как правило, я слишком ленив, чтобы утруждать себя.
Сам запрос построен по шаблону insertQuery, а в последующих строках в качестве констант добавлены данные name и age.
Затем выполняется метод db.run, использующий константу insertQuery и эти два значения (name и age) в качестве атрибутов. В зависимости от успеха или неудачи операции будут сгенерированы сообщения журнала.
Но подождите немного. Что это за вопросительные знаки после объявления insertQuery? И зачем нам понадобилось разбивать этот процесс на две части?
На самом деле это важная практика безопасности, известная как escape variable. Когда метод db.run() выполняет подготовленный оператор, он автоматически обрабатывает экранирование значения переменной, предотвращая SQL-инъекции.
Наконец, мы закрываем соединение:
db.close();
Изменение данных
Теперь давайте посмотрим, как работает код ”Изменить”. Как и раньше, мы создаем константу SQLite3, а затем подключаемся к нашей базе данных.
Однако на этот раз наша таблица уже существует, поэтому мы можем сразу перейти к разделу ”Изменить”.
const sqlite3 = require('sqlite3').verbose();
// Создаем/подключаемся к базе данных
const db = new sqlite3.Database('mydatabase.db');
// Модифицируем данные
const updateQuery = `UPDATE users SET age = ? WHERE name = ?`;
const updatedAge = 30;
const updatedName = 'name2';
db.run(updateQuery, [updatedAge, updatedName], function (err) {
if (err) {
console.error(err.message);
} else {
console.log(`Modified ${this.changes} row(s)`);
}
});
// Закройте соединение с базой данных
db.close();
Схема похожа. Мы определяем метод updateQuery для UPDATE записи, которую мы определим. Эта операция изменит значение age для записи, имя которой равно Trevor.
Вы можете вспомнить, что ранее возраст Тревора был указан как 25 лет. Мы изменим его на 30. Все остальное будет работать так же, как и раньше, включая закрытие соединения по окончании работы.
Эта часть кода из третьего файла удаляет запись:
const deleteQuery = `DELETE FROM users WHERE name = ?`;
const deletedName = 'name1';
db.run(deleteQuery, [deletedName], function (err) {
if (err) {
console.error(err.message);
} else {
console.log(`Удалено ${this.changes} ряд(ов)`);
}
});
Приведенный выше код удалит запись, имя которой равно Trevor.
Вы можете запустить любой из этих файлов с помощью команды node. Но сначала вам следует убедиться, что вы установили модуль sqlite3:
npm install sqlite3
Далее я использую node для запуска первого файла (который вы можете назвать db.js).
node db.js
Вставлены данные с идентификатором 1
Мы видим, что новая запись была успешно вставлена. Если вы просмотрите содержимое каталога, то увидите, что был создан новый файл mydatabase.db.
Вы всегда можете вручную войти в sqlite3, чтобы посмотреть, что могло измениться. Я буду ссылаться на файл mydatabase.db, чтобы мы могли сразу же открыть его.
sqlite3 mydatabase.db
Набрав .tables в интерфейсе SQLite, вы получите список всех существующих таблиц в этой базе данных. В нашем случае это будет созданная нами таблица users.
sqlite> .tables
users
sqlite>
Теперь я использую команду SQL select для отображения записи. Здесь я буду использовать звездочку для обозначения всех записей и укажу таблицу users.
sqlite> SELECT * FROM users;
1|Trevor|25
sqlite>
Мы видим, что была создана запись 1, содержащая Тревора, которому 25 лет. Отлично!
Наконец, мы можем запустить код delete, который должен полностью удалить Тревора:
const deleteQuery = `DELETE FROM users WHERE name = ?`;
const deletedName = 'Trevor';
db.run(deleteQuery, [deletedName], function (err) {
if (err) {
console.error(err.message);
} else {
console.log(`Удалено ${this.changes} ряд(ов)`);
}
});
Следует отметить, что формат db.run и db.close, который я использовал для этих методов, можно также назвать Database.run() и database.close(). Это просто вопрос предпочтений - или, в моем случае, лени. В конце концов, я администратор Linux, а самые лучшие администраторы в принципе ленивы.
Резюме
Мы увидели, как с помощью JavaScript подключиться к базе данных, создать новую таблицу, а затем добавлять, изменять и удалять записи в этой таблице. И, похоже, нам это сошло с рук!
Теперь попробуйте сделать это на своем компьютере. Но поиграйте со значениями. А еще лучше - создайте что-нибудь практичное.