Gorm -- modificar registros

atualizar um único campo

user := &model.User{
    
    
	Id:   5511,
	Name: "测试goper",
	Age:  10,
}

Modificar informações de linha por ID

O uso de Model(user) GORM modificará as informações da linha de consulta no usuário por padrão.

db.Debug().Model(user).UpdateColumn("name", "测试修改")
----------------------------
UPDATE `user` SET `name`='测试goper',`age`=10 WHERE `id` = 5511

Modificar registros de acordo com as condições da consulta

db.Debug().Model(&model.User{
    
    }).Where("name = ?","测试goper").Update("name", "测试修改")
-------------------------------
UPDATE `user` SET `name`='重置了姓名',`name`='测试修改' WHERE name = '测试goper'

Campos de atualização em massa

Modifique outros campos de acordo com a chave primária da classe de entidade

Modifique através dos campos que foram atribuídos na classe de entidade.

result := db.Debug().Updates(&user)
if result.Error != nil {
    
    
	fmt.Println(result.Error)
}
-------------------------------------
UPDATE `user` SET `name`='测试goper',`age`=10 WHERE `id` = 5511

Especifique o ID para modificar outros campos (classe de entidade modelo)

Deve-se observar que se você usar a classe de entidade modelo para atualizar o campo, o campo precisa ser diferente de zero, caso contrário, o campo não será atualizado

db.Debug().Model(user).Updates(model.User{
    
    InfantName: "ceshi2", Age: 18})
db.Debug().Model(user).Updates(model.User{
    
    InfantName: "ceshi2", Age: 0})
---------------------------------
UPDATE `user` SET `infant_name`='ceshi2',`age`=18 WHERE `id` = 5511
UPDATE `user` SET `infant_name`='ceshi2' WHERE `id` = 5511

Especifique o ID para modificar outros campos (dicionário)

Modifique as informações da linha na forma de um dicionário sem se preocupar com valores diferentes de zero

db.Debug().Model(user).Updates(map[string]interface{
    
    }{
    
    "name": "批量修改", "age": 20})
db.Debug().Model(user).Updates(map[string]interface{
    
    }{
    
    "name": "批量修改", "age": 0})
-----------------------------
UPDATE `user` SET `age`=20,`name`='批量修改' WHERE `id` = 5511
UPDATE `user` SET `age`=0,`name`='批量修改' WHERE `id` = 5511

Especifique o valor do campo que precisa ser modificado

A primeira linha apenas modifica o campo nome, e o segundo parágrafo modifica os campos nome e idade

db.Debug().Model(user).Select("name").Updates(model.User{
    
    Name: "ceshi2", Age: 18})
db.Debug().Model(user).Select("name", "age").Updates(map[string]interface{
    
    }{
    
    "name": "ceshi2", "age": 0})
----------------------------
UPDATE `user` SET `name`='ceshi2' WHERE `id` = 5511
UPDATE `user` SET `age`=0,`name`='批量修改' WHERE `id` = 5511

Valores de campo de blindagem que não precisam ser modificados

Não modifique o campo de nome

db.Debug().Model(user).Omit("name").Updates(model.User{
    
    Name: "ceshi2", Age: 18})
db.Debug().Model(user).Omit("name").Updates(map[string]interface{
    
    }{
    
    "name": "批量修改", "age": 0})
------------------------------
UPDATE `user` SET `age`=18 WHERE `id` = 5511
UPDATE `user` SET `age`=0 WHERE `id` = 5511

Use a função gancho

Ordem de execução da função de gancho

Antes de Salvar - Antes de Atualizar - Depois de Atualizar - Depois de Salvar

Use BeforUpdate para verificar a modificação

Modifique o usuário modelo

func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
    
    
	// u.UserDesc = "使用钩子函数更新了一个属性"
	// return

	if tx.Statement.Changed("Name") {
    
    
		fmt.Println("修改了姓名")
	}

	if tx.Statement.Changed("Name", "UserDesc") {
    
    
		fmt.Println("修改了姓名或用户描述")
	}

	if tx.Statement.Changed() {
    
    
		fmt.Println("修改了任意信息")
	}
	return nil
}
db.Debug().Model(user).Update("name", "测试修改")
----------------
修改了姓名
UPDATE `user` SET `name`='测试修改' WHERE `id` = 5511

sem função de gancho

Atualize usando UpdateColumn e UpdateColumns
Deve-se observar que após usarmos UpdateColumn para modificar, os valores dos campos na classe de entidade do modelo também serão atualizados. Portanto, o nome no segundo conteúdo modificado abaixo também é 'nome modificado'

db.Debug().Model(user).UpdateColumn("name", "修改姓名")
db.Debug().UpdateColumns(user)
----------------------------------
UPDATE `user` SET `name`='修改姓名' WHERE `id` = 5511
UPDATE `user` SET `name`='修改姓名',`age`=10 WHERE `id` = 5511

Atualização completa da tabela

Especifique o nome da tabela diretamente ou use uma classe de entidade de modelo de usuário vazia,

db.Debug().Table("user").Where("1=1").Updates(map[string]interface{
    
    }{
    
    
	"name": "Test2",
})
db.Debug().Model(&model.User{
    
    }).Where("1=1").Updates(&model.User{
    
    
	Name: "Test",
})
----------------------------
UPDATE `user` SET `name`='Test2'
UPDATE `user` SET `name`='Test'

A atualização da tabela completa deve ter uma condição where, caso contrário, um erro será relatado e a condição where ausente está ausente, porque gorm não permite a atualização completa da tabela por padrão
ou adiciona Session AllowGlobalUpdate: true

db.Debug().Table("user").Session(&gorm.Session{
    
    AllowGlobalUpdate: true}).Updates(map[string]interface{
    
    }{
    
    
	"name": "Test5",
})
--------------------------------
UPDATE `user` SET `name`='Test5'

SQL personalizado usando EXEC

db.Debug().Exec("UPDATE user SET name = ?", "Test4")
------------------------
UPDATE user SET name = 'Test4'

Usar expressões SQL

use gorm.Expr("")

db.Debug().Table("user").Where("id = ?", 521).Updates(map[string]interface{
    
    }{
    
    "name": gorm.Expr("concat('SQL','表达式')")})
------------------------------
UPDATE `user` SET `name`=concat('SQL','表达式') WHERE id = 521

おすすめ

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