Modifications de la version 2 de GORM

Préface

En août 2020, GORM v2.0 est sorti. Il y a de nombreux changements et certaines fonctions ne sont pas compatibles avec la v1, je voudrais donc les aborder dans cet article. change log link

Change Log 
v2.0 - 2020.08
GORM 2.0 est une réécriture à partir de zéro, introduisant des modifications d'API incompatibles et de nombreuses améliorations

-Amélioration des performances
-Modularité améliorée
- Context, Batch Insert, Prepared Statment Mode, DryRun Mode, Join Preload, Find To Map, Create From Map,Prend en charge FindInBatches.
- SavePoint/RollbackTo/Prend en charge les transactions imbriquées.
-Arguments nommés, conditions de groupe, upserts, verrous, optimiseurs/indice/Prise en charge des conseils de commentaire, sous-requêtes améliorées
-Prise en charge complète des relations d'auto-référence, table de jointure améliorée, mode d'association de données par lots
-Créer/Prise en charge de plusieurs champs pour le suivi des heures de mise à jour. UNIX (millimètre)/Le support Nano) secondes est ajouté.
-Prise en charge des autorisations de terrain: read-only, write-only, create-only, update-only, ignored
-Nouveau système de plug-in: plusieurs bases de données, lues par le résolveur de base de données de plug-in/Prise en charge de l'écriture fractionnée, intégration Prometheus ...
-Nouvelle API hook: interface intégrée avec plugins
-Nouvelle migration: relations, contraintes/Vous pouvez créer une clé externe de base de données pour la prise en charge du vérificateur, la prise en charge des index étendus
-Nouvel enregistreur: prise en charge contextuelle, évolutivité accrue
-Règles de dénomination unifiées: nom de table, field name, join table name, foreign key, checker, index name
-Prise en charge de meilleurs types de données personnalisés(e.g: JSON)

Les pièces incompatibles en raison de différences de version sont répertoriées ci-dessous.

Connexion à la base de données

v2

main.go


package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main(){
	dsn := "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local"
	v2_db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

v1

main.go


package main

import (
      "github.com/jinzhu/gorm"
      _"github.com/jinzhu/gorm/dialects/mysql"
)

func main(){
	v1_db, err := gorm.Open("mysql", "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
}

Fermer la base de données

v2

main.go


package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main(){
	dsn := "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local"
	v2_db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	db, err := v2_db.DB()
	defer db.Close()
}

v1

main.go



package main

import (
        "github.com/jinzhu/gorm"
      _"github.com/jinzhu/gorm/dialects/mysql"
)

func main(){
    v1_db, err := gorm.Open("mysql", "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
    defer v1_db.Close()
}

Nouvelle table

v2

main.go


package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
  	Id int
	Name string
	Age int
	Addr string
	Pic string
}

func main(){
  dsn := "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local"
  v2_db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  //Créez une table appelée Utilisateurs
  v2_db.Migrator().CreateTable(&User{})
}

v1

main.go


package main

import (
      "github.com/jinzhu/gorm"
      _"github.com/jinzhu/gorm/dialects/mysql"
)

func main(){
    v1_db, err := gorm.Open("mysql", "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
    //Créez une table appelée Utilisateurs
    v1_db.CreateTable(&User{})
}

Supprimer la table

v2

main.go


package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    Id int
    Name string
    Age int
    Addr string
    Pic string
}

func main(){
  dsn := "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local"
  v2_db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  
  //Supprimer la table
  v2_db.Migrator().DropTable(&User{})
}

v1

main.go


package main

import (
      "github.com/jinzhu/gorm"
      _"github.com/jinzhu/gorm/dialects/mysql"
)

func main(){
    v1_db, err := gorm.Open("mysql", "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
    //Supprimer la table
    v1_db.DropTable("users")
}

Confirmation de l'existence de la table

v2

main.go


package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main(){
  dsn := "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local"
  v2_db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

  //Confirmation de l'existence de la table
  b := v2_db.Migrator().HasTable("users")
  //La valeur de retour est de type booléen
  fmt.Println(b)
}

v1

main.go



package main

import (
      "github.com/jinzhu/gorm"
      _"github.com/jinzhu/gorm/dialects/mysql"
)

func main(){
    v1_db, err := gorm.Open("mysql", "root:@tcp(localhost:3306)/gorm_project?charset=utf8&parseTime=True&loc=Local")
    //Confirmation de l'existence de la table
    v1_db.HasTable("users")
    //La valeur de retour est de type booléen
    fmt.Println(b)
}

Suppression des fonctions associées

Les fonctions associées ne peuvent pas être utilisées dans la v2.

// Related get related associations
func (s *DB) Related(value interface{}, foreignKeys ...string) *DB {
	return s.NewScope(s.Value).related(value, foreignKeys...).db
}

Modifier la façon d'utiliser LogMode

v2

//Spécification du niveau de journal
db.Logger.LogMode(4)

v1

db.LogMode(Valeur booléenne)

Recommended Posts

Modifications de la version 2 de GORM