В этом курсе мы погрузимся в работу с базой данных. Сначала рассмотрим общие принципы, которые работают одинаково для любых запросов. Эти принципы включают такие пункты:
- Установка зависимостей
- Подключение к базе данных
- Подготовка запроса
- Выполнение запроса
- Формирование результата
Существует множество различных баз данных, для работы с каждой из них есть библиотека, а часто и несколько библиотек. Несмотря на это множество общие принципы у них схожие. Научившись работать с одной, вы сможете использовать любую другую. В этом курсе мы будем использовать PostgreSQL.
Для работы с базой данных мы будем использовать библиотеку slonik:
npm install slonik
Подключение к базе данных выглядит так:
import { createPool } from 'slonik'
const uri = 'postgresql://user:password@localhost:5432/database_name'
const pool = await createPool(uri)
Для подключения к базе данных, нужно указать параметры подключения. В них мы указываем пользователя базы данных, пароль, адрес базы данных, порт и другие настройки, необходимые для подключения.
Далее в уроке мы рассмотрим основной принцип работы с базой данных на примере работы с таблицей пользователя. Для начала создадим таблицу в коде, заполним ее и выведем данные в консоль:
import { createPool, sql } from 'slonik'
const uri = 'postgresql://user:password@localhost:5432/database_name'
const pool = await createPool(uri)
await pool.query(sql.unsafe`
CREATE TABLE users(id SERIAL PRIMARY KEY, username VARCHAR(255), phone VARCHAR(255))
`)
await pool.query(sql.unsafe`
INSERT INTO users(username, phone) VALUES
('tommy', '123456789'),
('john', '777777777')
`)
const result = await pool.query(sql.unsafe`
SELECT * FROM users
`)
console.log(result) // =>
// [
// { id: 1, username: 'tommy', phone: '123456789' },
// { id: 2, username: 'john', phone: '777777777' },
// ]
await pool.end()
Соединение с базой данных
Обычно программисты делают так: отдельно от приложения они поднимают СУБД, внутри которой они заранее создали необходимую базу данных. Таким образом, приложение соединяется с СУБД и подключается к конкретной базе данных внутри. Для этого нужны параметры подключения:
- IP-адрес или DNS-адрес
- Порт для подключения
- Логин и пароль
- Имя базы данных
При работе с базами данных в памяти все гораздо проще. База запускается прямо в памяти нашего приложения, поэтому ей не нужны доступы. Эту базу не нужно создавать заранее, она создается в момент выполнения соединения.
SQL-запросы
Дальше мы можем работать с базой с помощью обычных запросов SQL. Обратите внимание, что это асинхронные вызовы:
await connection.query(sql`
CREATE TABLE users(id SERIAL PRIMARY KEY, username VARCHAR(255), phone VARCHAR(255))
`)
Некоторые запросы выполняют выборку данных. В таком случае мы можем сохранить результат вызова:
const result = await connection.query(sql`
SELECT * FROM users
`)
console.log(result) // =>
// [
// { id: 1, username: 'tommy', phone: '123456789' },
// { id: 2, username: 'john', phone: '777777777' },
// ]
Для завершения соединения нужно вызвать метод pool.end(). Это важно, чтобы соединение не оставалось открытым. Так как количество соединений ограничено, если не закрыть соединение, то это может вызвать проблемы при повторных подключениях. Соединение завершится в любом случае при завершении работы приложения, но лучше делать вызов end(), чтобы избежать возможных проблем.
Итог
Мы разобрали основные шаги при работе с базами данных:
- Подключение к базе данных
- Выполнение запроса
- Получение результата запроса
- Закрытие соединения
В примерах мы разобрали как создать таблицу, добавить и извлечь данные.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.