Расскажите о вашем опыте работы с базами данных в Go.

Ответ

Я имею опыт работы с реляционными, NoSQL и in-memory базами данных. В каждом случае я использовал наиболее подходящие для Go инструменты и драйверы.

1. Реляционные БД (PostgreSQL, MySQL)

Для работы с SQL-базами я использовал как стандартную библиотеку database/sql, так и популярные ORM.

  • database/sql: Применял для написания нативных SQL-запросов, что дает полный контроль над производительностью и поведением. Отлично подходит для оптимизированных и сложных запросов.
  • ORM (GORM, sqlx): Использовал для ускорения разработки на CRUD-операциях и для более удобной работы с моделями данных в коде.

Пример подключения к PostgreSQL:

import (
    "database/sql"
    "context"
    _ "github.com/lib/pq" // Драйвер для PostgreSQL
)

db, err := sql.Open("postgres", "user=... password=... dbname=... sslmode=disable")
if err != nil {
    log.Fatal(err)
}
defer db.Close()

// Проверяем, что соединение действительно установлено
if err := db.PingContext(context.Background()); err != nil {
    log.Fatal(err)
}

2. NoSQL (MongoDB)

Для работы с документо-ориентированной базой MongoDB использовал официальный драйвер от MongoDB. Это было полезно в проектах, где требовалась гибкая схема данных.

import (
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
    log.Fatal(err)
}

3. In-Memory (Redis)

Redis активно применял для задач кеширования, управления сессиями и реализации простых очередей сообщений. Основной инструмент — библиотека go-redis.

import "github.com/go-redis/redis/v8"

client := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    Password: "", // no password set
    DB:       0,  // use default DB
})

4. Аналитические и поисковые системы

Также есть опыт интеграции с ClickHouse для аналитических запросов в высоконагруженных системах и с Elasticsearch для реализации полнотекстового поиска.