← Назад к вопросам

Какие библиотеки использовал при работе с БД?

1.0 Junior🔥 221 комментариев
#Node.js и JavaScript#Базы данных и SQL#Фреймворки и библиотеки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Библиотеки для работы с БД в Node.js

На протяжении моей карьеры я работал с различными подходами и библиотеками для взаимодействия с базами данных в Node.js. Вот наиболее эффективные решения, которые я применял в боевых проектах.

1. ORM решения

Prisma — я выбирал его для новых проектов благодаря отличной DX:

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

// Запросы с полной типизацией
const users = await prisma.user.findMany({
  where: { status: "ACTIVE" },
  include: { posts: true },
  orderBy: { createdAt: "desc" }
});

// Транзакции
const [user, post] = await prisma.$transaction([
  prisma.user.create({ data: { name: "John" } }),
  prisma.post.create({ data: { title: "Post", authorId: 1 } })
]);

TypeORM — для более сложных архитектур с декораторами:

import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToMany(() => Post, (post) => post.author)
  posts: Post[];
}

const userRepository = dataSource.getRepository(User);
const user = await userRepository.findOne({ where: { id: 1 }, relations: ["posts"] });

Sequelize — для Legacy проектов с моделями:

const User = sequelize.define("User", {
  name: DataTypes.STRING,
  email: DataTypes.STRING
});

const user = await User.findOne({ where: { id: 1 } });

2. Query Builder (когда ORM перебор)

Knex.js — гибкий и мощный query builder:

import knex from "knex";

const query = knex("users")
  .select("id", "name", "email")
  .where("status", "=", "active")
  .join("posts", "users.id", "=", "posts.user_id")
  .orderBy("created_at", "desc")
  .limit(10);

const users = await query;

sql.js / better-sqlite3 — для светлых SQL без предварительного связывания:

const db = new Database(":memory:");

db.exec(`
  CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT
  )
`);

const stmt = db.prepare("SELECT * FROM users WHERE id = ?");
const user = stmt.get(userId);

3. Драйверы для специфических БД

pg (для PostgreSQL) — низкоуровневый драйвер:

import { Pool } from "pg";

const pool = new Pool({
  connectionString: process.env.DATABASE_URL
});

const result = await pool.query(
  "SELECT * FROM users WHERE id = $1",
  [userId]
);

MongoDB драйверы — для NoSQL:

import { MongoClient } from "mongodb";

const client = new MongoClient(uri);
const collection = client.db("mydb").collection("users");

const user = await collection.findOne({ _id: ObjectId(id) });

Redis — для кэширования и сессий:

import { createClient } from "redis";

const client = createClient();
await client.connect();

await client.set("key", JSON.stringify(data), { EX: 3600 });
const cached = await client.get("key");

4. Миграции

Flyway / Goose — для версионирования схемы:

goose postgresql "postgres://localhost/mydb up"

Liquibase — для enterprise решений с ролбэками.

5. Пулинг соединений

pg с встроенным Pool или PgBouncer — критично для production:

const pool = new Pool({
  max: 20,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
});

6. Мониторинг и профилирование

pgAdmin / DBeaver — для анализа запросов

Slow query logs — отслеживание медленных операций:

db.on("query", (query) => {
  if (query.duration > 1000) {
    console.warn("Slow query:", query.sql);
  }
});

Мой выбор для новых проектов:

  • Postgres + Prisma — быстро разворачиваю features
  • Knex для сложных запросов — когда ORM недостаточно
  • Redis для кэширования — обязательно для high-load
  • Goose для миграций — просто и надёжно