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