Работа с базами данных: database/sql, подключения, транзакции

К вопросам
Средний
Database

Вопрос

Как подключиться к базе данных в Go? Что такое connection pool? Как работать с транзакциями?

Ответ

database/sql пакет: - Стандартный интерфейс для работы с БД - Автоматический connection pooling - Поддержка prepared statements - Безопасность от SQL injection Основные типы: - sql.DB - представляет БД и pool соединений - sql.Tx - транзакция - sql.Rows - результат запроса - sql.Stmt - подготовленный запрос

import (
    "database/sql"
    _ "github.com/lib/pq" // PostgreSQL driver
)

func main() {
    db, err := sql.Open("postgres", connString)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // Конфигурация pool'а
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(5)
    
    // Транзакция
    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }
    defer tx.Rollback()
    
    _, err = tx.Exec("INSERT INTO users (name) VALUES ($1)", "John")
    if err != nil {
        return
    }
    
    tx.Commit()
}
import (
    "database/sql"
    _ "github.com/lib/pq" // PostgreSQL driver
)

func main() {
    db, err := sql.Open("postgres", connString)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // Конфигурация pool'а
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(5)
    
    // Транзакция
    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }
    defer tx.Rollback()
    
    _, err = tx.Exec("INSERT INTO users (name) VALUES ($1)", "John")
    if err != nil {
        return
    }
    
    tx.Commit()
}

Дополнительные вопросы

Что такое prepared statements? Как работает connection pooling в database/sql?