Работа с базами данных в Go: PostgreSQL и MongoDB для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему Go и базы данных — идеальная пара

Go (Golang) — это современный компилируемый язык, созданный Google. Его главные преимущества — высокая производительность, простота и встроенная поддержка конкурентности. Когда дело доходит до работы с базами данных, Go предлагает мощные стандартные библиотеки и популярные сторонние драйверы для любых СУБД.

В этой статье мы разберем, как подключиться и выполнять базовые операции с двумя самыми популярными базами: реляционной PostgreSQL и документо-ориентированной MongoDB. Материал рассчитан на начинающих разработчиков, которые уже знакомы с основами синтаксиса Go.

1. Подготовка окружения и установка драйверов

Прежде чем писать код, убедитесь, что у вас установлен Go (версия 1.21+). Для работы с базами данных нам понадобятся драйверы. Установите их с помощью команд:

go get github.com/lib/pq          // для PostgreSQL
go get go.mongodb.org/mongo-driver // для MongoDB

Также убедитесь, что на вашей машине запущены соответствующие серверы баз данных (локально или через Docker).

1.1. Структура проекта

Создайте файл main.go. Вся логика будет сосредоточена в нем для простоты. В реальных проектах стоит разделять код на пакеты.

2. Работа с PostgreSQL в Go

PostgreSQL — мощная реляционная СУБД. Для работы с ней в Go используем пакет database/sql и драйвер lib/pq.

2.1. Подключение к базе данных

Создадим функцию подключения. Строка подключения (DSN) содержит хост, порт, имя пользователя и базу данных.

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/lib/pq"
)

func main() {
    connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable"
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Fatal("Ошибка подключения:", err)
    }
    defer db.Close()

    // Проверяем соединение
    err = db.Ping()
    if err != nil {
        log.Fatal("Не удалось установить соединение:", err)
    }
    fmt.Println("Успешно подключено к PostgreSQL!")
}

Важно: sql.Open не создает реальное соединение, только пул. Реальное подключение происходит при первом запросе или вызове Ping().

2.2. Создание таблицы и вставка данных

Теперь создадим таблицу users и добавим несколько записей.

// Создание таблицы
createTable := `
CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT
);`
_, err = db.Exec(createTable)
if err != nil {
    log.Fatal("Ошибка создания таблицы:", err)
}

// Вставка данных
insert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3)`
_, err = db.Exec(insert, "Иван Петров", "ivan@example.com", 30)
if err != nil {
    log.Fatal("Ошибка вставки:", err)
}
fmt.Println("Данные добавлены")

Обратите внимание на использование плейсхолдеров $1, $2 — это защита от SQL-инъекций.

2.3. Чтение и обновление данных

Выполним запрос на выборку и обновим возраст пользователя.

// Чтение данных
rows, err := db.Query("SELECT id, name, email, age FROM users")
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
    var id int
    var name, email string
    var age int
    err := rows.Scan(&id, &name, &email, &age)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("ID: %d, Имя: %s, Email: %s, Возраст: %d\n", id, name, email, age)
}

// Обновление
_, err = db.Exec("UPDATE users SET age = $1 WHERE name = $2", 31, "Иван Петров")
if err != nil {
    log.Fatal(err)
}
fmt.Println("Возраст обновлен")

3. Работа с MongoDB в Go

MongoDB — NoSQL база данных, хранящая данные в формате BSON (аналог JSON). Для Go используем официальный драйвер mongo-go-driver.

3.1. Подключение к MongoDB

Подключаемся к локальному экземпляру и выбираем базу данных.

package main

import (
    "context"
    "fmt"
    "log"
    "time"

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

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

    // Проверка соединения
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal("Не удалось подключиться к MongoDB:", err)
    }
    fmt.Println("Подключено к MongoDB!")

    // Выбираем базу данных и коллекцию
    collection := client.Database("testdb").Collection("users")
}

3.2. Вставка и чтение документов

MongoDB работает с документами. В Go для этого используется тип bson.D или структуры с тегами.

// Определяем структуру пользователя
type User struct {
    Name  string `bson:"name"`
    Email string `bson:"email"`
    Age   int    `bson:"age"`
}

// Вставка одного документа
user := User{Name: "Мария Смирнова", Email: "maria@example.com", Age: 25}
result, err := collection.InsertOne(ctx, user)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Вставлен документ с ID:", result.InsertedID)

// Чтение всех документов
cursor, err := collection.Find(ctx, bson.D{})
if err != nil {
    log.Fatal(err)
}
defer cursor.Close(ctx)

for cursor.Next(ctx) {
    var u User
    err := cursor.Decode(&u)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Имя: %s, Email: %s, Возраст: %d\n", u.Name, u.Email, u.Age)                

Блоги

Рекомендаций по книгам