Gorm -- 設定接続、Gorm モデルおよびタグの説明

依存関係を導入する

go get -u github.com/spf13/viper
go get -u gorm.io/gorm 
go get -u gorm.io/driver/mysql

構成ファイルを読み取る

設定ファイルの構成は以下のとおりです。
データベース接続情報、最大接続数、最大アイドル数の3つの設定を設定します。
ここに画像の説明を挿入

package config

import (
	"github.com/spf13/viper"
)

var AppConfig *Config

type Config struct {
    
    
	Mysql MysqlConfig `json:"mysql"`
}
/*
* Mysql 相关配置
 */
type MysqlConfig struct {
    
    
	Dsn          string `json:"Dsn"`
	MaxIdleConns *int   `json:"MaxIdleConns,omitempty"`
	MaxOpenConns *int   `json:"MaxOpenConns,omitempty"`
}
func LoadConfig() error {
    
    
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	//读取配置文件
	if err := viper.ReadInConfig(); err != nil {
    
    
		return err
	}
	//将配置文件中的信息读取到结构体中
	if err := viper.Unmarshal(&AppConfig); err != nil {
    
    
		return err
	}
	return nil
}

func GetAppConfig() Config {
    
    
	return *AppConfig
}

データベース接続プールの構成

  • 接続プールを使用してデータベース接続の頻繁な作成を回避する
  • 最大接続数と最大アイドル数を制御する
  • Gorm はデフォルトでテーブル名の複数形を使用します。つまり、User構造が使用されている場合、対応するテーブル名はデフォルトでusersとなり、テーブル名は複数形を使用しないように構成する必要があります。
package cus_orm

import (
	"mingvvv/config"

	"gorm.io/driver/mysql"
	"gorm.io/gorm/schema"

	"gorm.io/gorm"
)

var db *gorm.DB

func MysqlConnection() *gorm.DB {
    
    
	if db == nil {
    
    

		config := config.GetAppConfig()

		dsn := &config.Mysql.Dsn
		maxIdleConns := config.Mysql.MaxIdleConns
		maxOpenConns := config.Mysql.MaxOpenConns

		if dsn == nil {
    
    
			panic("non mysql dsn")
		}

		dbcreater, err := gorm.Open(mysql.Open(*dsn), &gorm.Config{
    
    
			NamingStrategy: schema.NamingStrategy{
    
    
				SingularTable: true, //表名不使用复数形式
			},
		})
		db = dbcreater
		if err != nil {
    
    
			panic("failed to connect database")
		}

		sqlDb, _ := db.DB()

		if maxIdleConns != nil {
    
    
			sqlDb.SetMaxIdleConns(*maxIdleConns) // 设置最大空闲数
		}
		if maxOpenConns != nil {
    
    
			sqlDb.SetMaxOpenConns(*maxOpenConns) // 设置最大连接数
		}
	}

	return db
}

モデルを定義する

データベーステーブル情報

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `infant_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '小名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `user_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '描述',
  `json_field` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `user_role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `role_id` int DEFAULT NULL COMMENT '角色ID\r\n',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

対応する構造を作成する

type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int `gorm:"default:18"`
	UserDesc   string
	JsonField  map[string]string `gorm:"serializer:json"`
	CreateTime time.Time
	UpdateTime time.Time
	UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"` //指定外键
}

type UserRole struct {
    
    
	Id     uint `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	UserId uint
	RoleId uint
}

データモデル内のフィールドのラベルプロパティ

上記のように、データ モデルを作成するときは、フィールドの後に一連のgormタグを追加します。これらのタグは、読み取りおよび書き込み時のフィールドの機能パフォーマンスに影響します。
以下は一般的に使用されるいくつかのタグ属性です。残りは公式 Web サイトのリンク
https://gorm.io/docs/models.html#embedded_structを参照してください。

これは、データベース内のどのフィールドが構造体のフィールドに対応するかを指定するために使用されます。たとえば、
構造体Userに指定された名前は、データベース テーブルの名前フィールドに対応します。

シリアライザ

フィールドをシリアル化する方法を指定します

たとえば、構造 User には次のような行があります。

JsonField  map[string]string `gorm:"serializer:json"`

構造内の辞書とデータベース内の json 型の間のシリアル化変換を示します。
シリアル化を行わないと、データの追加または読み取り時に例外がスローされます。

//新增时
[error] unsupported data type: &map[]

主キー

フィールドを主キーとして指定します

デフォルト

フィールドのデフォルト値を指定します

自動インクリメント / AUTO_INCREMENT

フィールドを自動インクリメントとして指定します。
フィールドが type タグで設定されている場合、autoIncrement タグは type タグの直後に設定する必要があることに注意してください。そうしないと、有効にならない可能性があります。たとえば
gorm:"type:bigint autoIncrement"

埋め込み / 埋め込みプレフィックス

構造体のフィールドを現在の構造体に埋め込みます。embeddedPrefix はプロパティの前にプレフィックスを追加します。

type Desc struct {
    
    
	Desc1 string
	Desc2 string
}
type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int               `gorm:"default:18"`
	Desc       Desc              `gorm:"embedded;embeddedPrefix:user_"`
}

User 構造体は次の構造体と同等です。

type User struct {
    
    
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int     `gorm:"default:18"`
	Desc1      string  `gorm:"column:user_desc1"`
	Desc2      string  `gorm:"column:user_desc2"`
}

自動作成時間

作成時に現在時刻が自動的に設定されます。フィールド属性が int 型の場合、現在時刻の UNIX タイムスタンプがマイクロ秒、ミリ秒で取得され
autoCreateTime:nanoます
autoCreateTime:milli

自動更新時間


autoCreateTime:nano作成または変更時に現在時刻を自動的に入力します。フィールド属性が int 型の場合、現在時刻の Unix タイムスタンプをマイクロ秒ミリ
autoCreateTime:milli秒単位で取得します。

-

現在のフィールドを無視する

外部キー / 参照

外部キーの関連付けを設定する

構造体のこの行は User

UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"`

意味:
user_roleの外部キーはuser_id、これはuserテーブルのidフィールドに対応します。
構造関係の観点から見ると、UserRole構造はUserIdおよびUser構造のIDに関連付けられます。

この関係は、新しいデータが追加されるときに、関連付けられた挿入操作をトリガーします。
つまり、ユーザー データの一部が挿入され、構造内の UserRole がゼロでない場合、ユーザーは同時に user_role テーブルにもデータの一部を挿入し、外部キー値 (ユーザー テーブルの ID) を自動的に入力します。

おすすめ

転載: blog.csdn.net/qq_40096897/article/details/129026914