Работа с базами данных: database/sql, подключения, транзакции
Вопрос
Как подключиться к базе данных в 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?