Diretório de artigos
-
- atualizar um único campo
- Campos de atualização em massa
-
- Modifique outros campos de acordo com a chave primária da classe de entidade
- Especifique o ID para modificar outros campos (classe de entidade modelo)
- Especifique o ID para modificar outros campos (dicionário)
- Especifique o valor do campo que precisa ser modificado
- Valores de campo de blindagem que não precisam ser modificados
- Use a função gancho
- Atualização completa da tabela
- SQL personalizado usando EXEC
- Usar expressões SQL
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