Введение: Почему 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)