En aquest tema, aprendrem a utilitzar un ORM (Object-Relational Mapping) en Go per interactuar amb bases de dades de manera més eficient i amb menys codi repetitiu. Un ORM ens permet treballar amb bases de dades utilitzant objectes en lloc de sentències SQL directes, facilitant així la gestió de dades.

Objectius del Tema

  • Entendre què és un ORM i els seus avantatges.
  • Configurar un ORM popular en Go.
  • Realitzar operacions bàsiques de CRUD (Create, Read, Update, Delete) utilitzant l'ORM.

Què és un ORM?

Un ORM (Object-Relational Mapping) és una tècnica de programació que permet convertir dades entre sistemes de tipus incompatibles utilitzant llenguatges de programació orientats a objectes. En termes simples, un ORM ens permet interactuar amb una base de dades utilitzant objectes en lloc de sentències SQL.

Avantatges d'Utilitzar un ORM

  • Abstracció de la Base de Dades: No cal escriure SQL manualment.
  • Mantenibilitat: El codi és més net i fàcil de mantenir.
  • Portabilitat: Facilita el canvi de bases de dades sense canviar el codi de l'aplicació.
  • Seguretat: Redueix el risc d'injeccions SQL.

Configuració de GORM

GORM és un dels ORMs més populars per a Go. A continuació, veurem com configurar-lo i utilitzar-lo per realitzar operacions bàsiques.

Instal·lació de GORM

Per instal·lar GORM, utilitzarem el gestor de paquets go get:

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

Configuració Bàsica

A continuació, configurarem GORM per utilitzar una base de dades SQLite. Crearem una estructura per representar una taula de la base de dades i veurem com inicialitzar la connexió.

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

// Definim una estructura que representa una taula de la base de dades
type Product struct {
    ID    uint   `gorm:"primaryKey"`
    Code  string `gorm:"unique"`
    Price uint
}

func main() {
    // Inicialitzem la connexió a la base de dades
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal("failed to connect database")
    }

    // Migrar l'esquema
    db.AutoMigrate(&Product{})

    // Crear un nou producte
    db.Create(&Product{Code: "D42", Price: 100})

    // Llegir el producte
    var product Product
    db.First(&product, 1) // Trobar producte amb ID 1
    db.First(&product, "code = ?", "D42") // Trobar producte amb codi D42

    // Actualitzar el producte
    db.Model(&product).Update("Price", 200)

    // Esborrar el producte
    db.Delete(&product, 1)
}

Explicació del Codi

  1. Definició de l'Estructura: Definim una estructura Product que representa una taula de la base de dades. Utilitzem etiquetes per especificar claus primàries i únics.
  2. Inicialització de la Connexió: Utilitzem gorm.Open per connectar-nos a una base de dades SQLite.
  3. Migració de l'Esquema: db.AutoMigrate crea la taula products basada en l'estructura Product.
  4. Operacions CRUD:
    • Crear: db.Create afegeix un nou registre a la taula.
    • Llegir: db.First recupera un registre de la taula.
    • Actualitzar: db.Model(&product).Update actualitza un camp del registre.
    • Esborrar: db.Delete elimina un registre de la taula.

Exercicis Pràctics

Exercici 1: Crear una Taula d'Usuaris

  1. Defineix una estructura User amb els camps ID, Name, i Email.
  2. Utilitza GORM per crear la taula users i afegeix alguns registres.

Solució

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Email string `gorm:"unique"`
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal("failed to connect database")
    }

    db.AutoMigrate(&User{})

    db.Create(&User{Name: "John Doe", Email: "[email protected]"})
    db.Create(&User{Name: "Jane Doe", Email: "[email protected]"})
}

Exercici 2: Actualitzar i Esborrar Usuaris

  1. Actualitza el nom d'un usuari amb un correu electrònic específic.
  2. Esborra un usuari amb un ID específic.

Solució

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
)

type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Email string `gorm:"unique"`
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal("failed to connect database")
    }

    db.AutoMigrate(&User{})

    // Actualitzar el nom d'un usuari
    var user User
    db.First(&user, "email = ?", "[email protected]")
    db.Model(&user).Update("Name", "John Smith")

    // Esborrar un usuari
    db.Delete(&user, user.ID)
}

Conclusió

En aquest tema, hem après què és un ORM i com utilitzar GORM per realitzar operacions bàsiques de CRUD en una base de dades SQLite. Hem vist com definir estructures que representen taules de la base de dades, com inicialitzar la connexió a la base de dades i com realitzar operacions de creació, lectura, actualització i esborrat de registres.

En el proper tema, explorarem com realitzar migracions de bases de dades per gestionar canvis en l'esquema de manera eficient.

© Copyright 2024. Tots els drets reservats