Go Academy · Oppitunti

Hookit ja scopet

Mukauta kyselyitä

Oppitunti 4/413 vaihetta

Hookit ja scopet on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.

Hookit ja scopet

GORM tarjoaa kaksi mukautustyökalua: hookit suorittavat koodia automaattisesti elinkaaritapahtumien yhteydessä, ja scopet kokoavat uudelleenkäytettävää kyselylogiikkaa. Yhdessä ne pitävät tietojen käsittelyn selkeänä ja yhdenmukaisena.

Mitä hookit ovat

Hookit ovat mallin metodeja, joita GORM kutsuu ennen operaatiota tai sen jälkeen: BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete ja muita.

BeforeCreate-hookki

Määritelkää malliin oikean allekirjoituksen mukainen metodi. Tässä asetamme UUID:n ennen tietueen lisäämistä.

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.UUID = uuid.NewString()
    return nil
}

Validointi hookeissa

Palauttakaa hookista virhe, jos haluatte keskeyttää operaation. GORM peruuttaa ympäröivän transaktion, joten virheelliset tiedot eivät koskaan päädy tietokantaan.

func (u *User) BeforeSave(tx *gorm.DB) error {
    if u.Age < 0 {
        return errors.New("age cannot be negative")
    }
    return nil
}

Hookit suoritetaan transaktiossa

tx *gorm.DB-argumentti on GORMin käyttämä transaktio. Jos kirjoitatte hookissa toisiinsa liittyviä tietoja, käyttäkää tätä tx-oliota, jotta muutokset vahvistetaan tai peruutetaan atomisesti pääoperaation mukana.

Mitä scopet ovat

Scope on funktio, joka ottaa vastaan ja palauttaa *gorm.DB-arvon ja kapseloi kyselyosan. Se otetaan käyttöön db.Scopes(...)-kutsulla, ja sitä voi käyttää uudelleen useissa kyselyissä.

func ActiveUsers(db *gorm.DB) *gorm.DB {
    return db.Where("active = ?", true)
}

Scopejen käyttäminen

Välitä yksi tai useampi scope Scopes-funktiolle. Ne yhdistyvät, joten suodattimet voi koota deklaratiivisesti lopulliseksi kyselyksi.

db.Scopes(ActiveUsers, Recent).Find(&users)

Suoritettava hook- ja scope-simulaatio

GORM tarvitsee tietokannan, joten tässä suoritettavassa esimerkissä simuloidaan BeforeCreate-hookia ja uudelleenkäytettävää scope-tyyppistä suodatinta tavallisilla funktioilla.

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)))
}

Scopet sivutukseen

Yleinen scope muodostaa sivutuksen sivunumeron perusteella ja kapseloi Offset- ja Limit-arvot, jotta jokainen listapäätepiste käyttää sivutusta samalla tavalla.

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)
    }
}

Hookit ja sovelluslogiikka

Hookit keskittävät poikkileikkaavat huolenaiheet, kuten aikaleimat, slug-arvot ja auditointikentät. Raskas liiketoimintalogiikka kannattaa pitää palveluissa, ei hookeissa, jotta toiminta säilyy ennakoitavana ja testattavana.

Hookien ohittaminen

Massatoiminnoissa hookit voi poistaa käytöstä kutsulla db.Session(&gorm.Session{SkipHooks: true}). Tämä nopeuttaa suuria tuonteja, mutta ohittaa validointisi, joten käytä sitä harkiten.

Pikatarkistus

Testaa hookeja ja scopeja koskeva osaamisesi.

Kertaus

Opit hookit ja scopet:

  • Hookit suoritetaan elinkaaritapahtumien yhteydessä; virheen palauttaminen keskeyttää toiminnon ja peruuttaa transaktion
  • Hookit suoritetaan transaktion sisällä tx-argumentin kautta
  • Scopet ovat uudelleenkäytettäviä *gorm.DB-funktioita, joita käytetään Scopes-kutsulla
  • Käytä scopeja suodattimiin ja sivutukseen
  • SkipHooks ohittaa hookit massatoiminnoissa
Aloita maksutta

Opi Go tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Hookit ja scopet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “Hookit ja scopet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Hookit ja scopet”?

Mukauta kyselyitä Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Hookit ja scopet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Go Academy-oppitunnilla?

Kyllä. Jokainen Go Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Mallit ja AutoMigrate
  2. CRUD-operaatiot
  3. Assosiaatiot
  4. Hookit ja scopet
← Takaisin: Go Academy