Хуки и области видимости
Настраивайте запросы
«Хуки и области видимости» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Обработчики и области запросов
GORM предоставляет два инструмента настройки: обработчики автоматически запускают код при событиях жизненного цикла, а области запросов объединяют повторно используемую логику запросов. Вместе они делают доступ к данным чистым и согласованным.
Что такое обработчики
Обработчики — это методы модели, которые GORM вызывает до или после операции: BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete и другие.
Обработчик BeforeCreate
Определите в модели метод с подходящей сигнатурой. В этом примере мы задаём UUID до вставки записи.
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.UUID = uuid.NewString()
return nil
}Проверка данных в обработчиках
Верните ошибку из обработчика, чтобы прервать операцию. GORM откатывает окружающую транзакцию, поэтому недопустимые данные никогда не попадают в базу данных.
func (u *User) BeforeSave(tx *gorm.DB) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
return nil
}Обработчики выполняются в транзакции
Аргумент tx *gorm.DB — это транзакция, которую использует GORM. Если Вы записываете связанные данные внутри обработчика, используйте этот tx, чтобы изменения зафиксировались или откатились атомарно вместе с основной операцией.
Что такое области
Область — это функция, которая принимает и возвращает *gorm.DB, инкапсулируя фрагмент запроса. Вы применяете её с помощью db.Scopes(...) и повторно используете во многих запросах.
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}Применение областей
Передайте в Scopes одну или несколько областей. Они комбинируются, поэтому Вы можете декларативно объединять фильтры в итоговый запрос.
db.Scopes(ActiveUsers, Recent).Find(&users)Рабочий пример обработчика и имитации области
GORM нужна база данных, поэтому в этом запускаемом примере обычные функции имитируют обработчик BeforeCreate и повторно используемый фильтр, подобный области.
package main
import (
"errors"
"fmt"
)
type User struct {
Name string
Age int
Active bool
}
func beforeCreate(u *User) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
if u.Name == "" {
u.Name = "anonymous"
}
return nil
}
func activeOnly(users []User) []User {
var out []User
for _, u := range users {
if u.Active {
out = append(out, u)
}
}
return out
}
func main() {
u := User{Age: 30, Active: true}
if err := beforeCreate(&u); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("created:", u.Name)
all := []User{u, {Name: "Lin", Active: false}}
fmt.Println("active count:", len(activeOnly(all)))
}Области для постраничной выдачи
Обычно область формирует постраничную выдачу по номеру страницы, инкапсулируя Offset и Limit, чтобы каждый конечный маршрут для списков работал одинаково.
func Paginate(page, size int) func(*gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Offset((page - 1) * size).Limit(size)
}
}Обработчики и логика приложения
Обработчики централизуют сквозные задачи, такие как временные метки, читаемые идентификаторы и поля аудита. Сложную бизнес-логику храните в службах, а не в обработчиках, чтобы поведение оставалось предсказуемым и пригодным для тестирования.
Пропуск обработчиков
Для массовых операций можно отключить обработчики с помощью db.Session(&gorm.Session{SkipHooks: true}). Это ускоряет крупный импорт, но пропускает Ваши проверки, поэтому используйте такую возможность осторожно.
Быстрая проверка
Проверьте свои знания об обработчиках и областях.
Итоги
Вы узнали об обработчиках и областях:
- Обработчики выполняются вокруг событий жизненного цикла; возврат ошибки прерывает операцию и откатывает транзакцию
- Обработчики выполняются внутри транзакции через аргумент tx
- Области — это повторно используемые функции *gorm.DB, применяемые с помощью Scopes
- Используйте области для фильтров и постраничной выдачи
- SkipHooks обходит обработчики при массовой обработке
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Хуки и области видимости» бесплатный?
Да — полный текст урока «Хуки и области видимости» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Хуки и области видимости»?
Настраивайте запросы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Хуки и области видимости»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модели и AutoMigrate
- Операции CRUD
- Ассоциации
- Хуки и области видимости