mysqlデータベース接続
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
const (
mysqlHost = "go-uccs"
mysqlPort = 3306
mysqlUser = "uccs"
mysqlPassword = 123456
mysqlDbname = "uccs"
)
dsn := fmt.Sprintf("%s:%d@tcp(%s:3306)/%s", mysqlUser, mysqlPassword, mysqlHost, mysqlDbname)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
グローバルロガーを構成する
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: logger.Silent, // Log level
Colorful: false, // Disable colors
},
)
gorm.Open(mysql.Open(dsn), &gorm.Config{newLogger})
log.LstdFlags
: ログ出力時にローカルタイムゾーンの日時を付加することを示します。出力形式は次のとおりです。 :2023/07/14 21:28:20 Hello, world!
SlowThreshold
スローSQL
しきい値を設定します。SQL
実行時間がこのしきい値を超えた場合、スローとして記録されますSQL
LogLevel
。 : ログレベルを設定します。 4gorm
つのログ レベルが定義されています: Silent
、Error
、Warn
、Info
。ニーズに応じて適切なログ レベルを選択できますColorful
。ログの表示に色付きフォントを使用するかどうかを設定します。設定されている場合false
、色付きフォントが無効になります。
テーブルを構築する
type Product struct {
gorm.Model
Code string
Price uint
}
db.AutoMigrate(&Product{})
gorm.Model
gorm
パッケージ内で定義された一般的なモデルである構造体であり、 4 つのフィールドID
、CreatedAt
、UpdatedAt
、が含まれます。DeletedAt
クラッド
新しいデータを作成する
db.Create(&Product{Code: "D42", Price: 100})
対応するSQL
ステートメント
INSERT INTO `products` (`created_at`,`updated_at`,`deleted_at`,`code`,`price`) VALUES ('2023-07-15 03:39:37.951','2023-07-15 03:39:37.951',NULL,'D42',100)
お問い合わせ
データの一部を見つける
データの検索に使用しますFirst
。デフォルトの検索には論理的に削除されたデータは含まれません
var product Product
db.First(&product, 1) // 查找主键为 1 的数据
対応するSQL
ステートメント
SELECT * FROM `products` WHERE `products`.`id` = 1 AND `products`.`deleted_at` IS NULL ORDER BY `products`.`id` LIMIT 1
条件検索
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的第一条数据
対応するSQL
ステートメント
SELECT * FROM `products` WHERE code = 'D42' AND `products`.`deleted_at` IS NULL ORDER BY `products`.`id` LIMIT 1
間違い
ErrRecordNotFound
データが見つからない場合はエラーを返します
ok := errors.Is(result.Error, gorm.ErrRecordNotFound)
すべてのデータをクエリする
var products []Product
db.Find(&products)
for _, product := range products {
fmt.Println(product)
}
対応するSQL
ステートメント
SELECT * FROM `products` WHERE `products`.`deleted_at` IS NULL
更新する
db.Model(&product).Where("code = ?", "D42").Update("Price", 300)
対応するSQL
ステートメント
UPDATE `products` SET `price`=300,`updated_at`='2023-07-15 03:47:29.659' WHERE code = 'D42' AND `products`.`deleted_at` IS NULL
複数の値を更新する
db.Model(&product).Where("code = ?", "D42").Updates(Product{Price: 200, Code: "F42"})
対応するSQL
ステートメント
UPDATE `products` SET `updated_at`='2023-07-15 03:50:35.218',`code`='F42',`price`=200 WHERE code = 'D42' AND `products`.`deleted_at` IS NULL
db.Model(&product).Where("code = ?", "F42").Updates(map[string]interface{}{"Price": 300, "Code": "D42"})
対応するSQL
ステートメント
UPDATE `products` SET `code`='D42',`price`=300,`updated_at`='2023-07-15 03:53:26.329' WHERE code = 'F42' AND `products`.`deleted_at` IS NULL
保存方法
save
このメソッドは値が割り当てられていないフィールドを保存します。デフォルト値はゼロです。
type User {
Name string `gorm:"column:user_name"`
Email string
}
user := User{Name: "uccs1"}
db.Save(&user)
対応するSQL
ステートメント
INSERT INTO `users` (`user_name`,`email`) VALUES ('uccs1','')
選択と省略
var user User
db.Model(&user).Where("user_id = ?", 1).Select("Email").Updates(User{Name: "uccs2", Email: "333"})
db.Model(&user).Where("user_id = ?", 1).Omit("Email").Updates(User{Name: "uccs333", Email: "333"})
対応するSQL
ステートメント
UPDATE `users` SET `email`='333' WHERE user_id = 1
UPDATE `users` SET `user_name`='uccs333' WHERE user_id = 1
消去
db.Delete(&product, 1)
対応するSQL
ステートメント
UPDATE `products` SET `deleted_at`='2023-07-15 03:57:07.889' WHERE `products`.`id` = 1 AND `products`.`deleted_at` IS NULL
Model
型がある場合gorm.DeletedAt
、自動的に論理的な削除の機能を取得し、フィールドに削除時刻を書き込み、データをクエリするときに、フィールドが空ではないデータをdeleted_at
自動的に無視します。deleted_at
Unscoped
永久削除は次のメソッドを使用して行うことができます
ゼロ以外の値のみを更新します
Updates(Product{Price: 0})
メソッドを使用して更新します。ゼロ以外の値のみを更新できます
go
では、フィールドに値がない場合、デフォルト値 (通常はゼロ値) が設定されるためです。
这时,就想更新一个字段为零值可以用 sql.NullString
类型,int
类型有 NullInt16
等
type Product {
Code sql.NullString
}
db.Model(&product).Where("code = ?", "D42").Updates(&Product{Code: sql.NullString{"", true}})
另一种是使用指针的形式
type Product {
Code *string
}
empty := ""
db.Model(&product).Where("code = ?", "D42").Updates(&Product{Code: &empty})
对应 SQL
语句
UPDATE `products` SET `updated_at`='2023-07-15 09:13:38.229',`code`='' WHERE code = 'D42' AND `products`.`deleted_at` IS NULL
表结构定义的细节
使用 tag
就可以自定义表结构,具体可以看文档:Declaring Models
type User struct {
UserId int `gorm:"primaryKey"`
Name string `gorm:"column:user_name;type:varchar(100);not null;index:idx_user_name;unique;default:'uccs'"`
}
创建记录
// 没有 ID
user := User{
Name: "uccs2",
}
result := db.Create(&user)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
// 执行完 db.Create 后,会有一个 ID
fmt.Println(user.ID)
批量创建
user := []User{{Name: "uccs21"}, {Name: "uccs31"}, {Name: "uccs41"}}
db.Create(&user)
对应的 SQL
语句
INSERT INTO `users` (`user_name`) VALUES ('uccs21'),('uccs31'),('uccs41')
使用 db.CreateInBatches
批量创建,每次创建 2
条
user := []User{{Name: "uccs21"}, {Name: "uccs31"}, {Name: "uccs41"}}
db.CreateInBatches(user, 2)
对应的 SQL
语句
INSERT INTO `users` (`user_name`) VALUES ('uccs21'),('uccs31')
INSERT INTO `users` (`user_name`) VALUES ('uccs41')
条件查询
查询条件有三种形式:string
、struct
、map
// string
db.Where("name = ?", "uccs").First(&user) // name 是数据库 column
// struct
db.Where(&User{MyName: "uccs"}).First(&user) // MyName 是 User 结构体的字段
// map
db.Where(map[string]interface{}{"name": "uccs"}).Find(&user)
要注意的是:使用 struct
形式作为条件,会屏蔽掉零值字段