Как добавить новый столбец в таблицу базы данных с помощью Go?

Ответ

Для добавления нового столбца в существующую таблицу используется SQL-команда ALTER TABLE. В Go это выполняется с помощью метода Exec из стандартного пакета database/sql.

Основной подход:

package main

import (
    "database/sql"
    "log"

    _ "github.com/lib/pq" // Пример с PostgreSQL драйвером
)

func main() {
    // db - это ваш экземпляр *sql.DB
    db, err := sql.Open("postgres", "user=... password=... dbname=... sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    query := `
        ALTER TABLE users 
        ADD COLUMN IF NOT EXISTS phone_number VARCHAR(255) NOT NULL DEFAULT ''
    `

    _, err = db.Exec(query)
    if err != nil {
        log.Fatalf("Не удалось добавить столбец: %v", err)
    }

    log.Println("Столбец 'phone_number' успешно добавлен.")
}

Ключевые моменты и лучшие практики:

  1. Идемпотентность: Используйте ADD COLUMN IF NOT EXISTS (поддерживается в PostgreSQL, SQLite и др.), чтобы избежать ошибок при повторном выполнении скрипта.
  2. Значение по умолчанию: При добавлении столбца с ограничением NOT NULL в таблицу с существующими данными, обязательно укажите DEFAULT, чтобы СУБД знала, чем заполнить этот столбец для старых записей.
  3. Миграции: В реальных проектах такие изменения управляются через системы миграций (например, golang-migrate/migrate, GORM AutoMigrate, pressly/goose). Это позволяет версионировать изменения схемы БД, применять и откатывать их в предсказуемом порядке.
  4. Блокировки: На больших таблицах (high-load) операция ALTER TABLE может вызвать длительную блокировку таблицы. Такие миграции следует планировать на время наименьшей нагрузки.