記事ディレクトリ
依存関係を導入する
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) を自動的に入力します。