В этом курсе мы погрузимся в работу с базой данных. Сначала рассмотрим общие принципы, которые работают одинаково для любых запросов. Эти принципы включают такие пункты:
- Установка зависимостей
- Подключение к базе данных
- Подготовка запроса
- Выполнение запроса
- Формирование результата
Существует множество различных баз данных, для работы с каждой из них есть библиотека, а часто и несколько библиотек. Несмотря на это множество общие принципы у них схожие. Научившись работать с одной, вы сможете использовать любую другую. В этом курсе мы будем использовать 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()
, чтобы избежать возможных проблем.
Итог
Мы разобрали основные шаги при работе с базами данных:
- Подключение к базе данных
- Выполнение запроса
- Получение результата запроса
- Закрытие соединения
В примерах мы разобрали как создать таблицу, добавить и извлечь данные.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.