pages/tr_TR/docs/delete.md
Bir kaydı silerken, silinen değerin birincil anahtara sahip olması gerekir, aksi takdirde toplu silme işlemini tetiklenir. Örneğin:
ctx := context.Background()
// Delete by ID
err := gorm.G[Email](db).Where("id = ?", 10).Delete(ctx)
// DELETE from emails where id = 10;
// Delete with additional conditions
err := gorm.G[Email](db).Where("id = ? AND name = ?", 10, "jinzhu").Delete(ctx)
// DELETE from emails where id = 10 AND name = "jinzhu";
// Email Id değerimizin '10' olduğunu varsayalım
db.Delete(&email)
// DELETE from emails where id = 10;
// Koşul belirterek silme işlemi
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
GORM, satır içi koşul ile birincil anahtar(lar) kullanarak nesneleri silmeye izin verir, sayılarla çalışır, ayrıntılar için Satır içi koşullar bölümüne göz atın
db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;
db.Delete(&User{}, "10")
// DELETE FROM users WHERE id = 10;
db.Delete(&users, []int{1,2,3})
// DELETE FROM users WHERE id IN (1,2,3);
GORM,BeforeDelete, AfterDelete hooklarına izin verir, bu yöntemler bir kayıt silinirken çağrılacaktır, ayrıntılar için Hooks sayfasına bakınız
func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
if u.Role == "admin" {
return errors.New("admin kullanıcısının silme yetkisi yok")
}
return
}
Belirtilen değerin birincil değeri yoksa, GORM bir toplu silme işlemi gerçekleştirir, koşulla eşleşen tüm kayıtları siler
ctx := context.Background()
// Batch delete with conditions
err := gorm.G[Email](db).Where("email LIKE ?", "%jinzhu%").Delete(ctx)
// DELETE from emails where email LIKE "%jinzhu%";
db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{})
// DELETE from emails where email LIKE "%jinzhu%";
db.Delete(&Email{}, "email LIKE ?", "%jinzhu%")
// DELETE from emails where email LIKE "%jinzhu%";
Çok sayıda kaydı verimli bir şekilde silmek için, Delete yöntemine birincil anahtarları içeren bir slice ekleyin.
var users = []User{{ID: 1}, {ID: 2}, {ID: 3}}
db.Delete(&users)
// DELETE FROM users WHERE id IN (1,2,3);
db.Delete(&users, "name LIKE ?", "%jinzhu%")
// DELETE FROM users WHERE name LIKE "%jinzhu%" AND id IN (1,2,3);
Herhangi bir koşul olmadan bir toplu silme işlemi gerçekleştirirseniz, GORM bunu çalıştırmaz ve ErrMissingWhereClause hatası döndürür
Eğer kullanmak istiyorsanız, bazı koşulları eklemelisiniz, Saf (Raw) SQL sorgusu kullanmalısınız veya AllowGlobalUpdate modunu aktif etmeniz gerekiyor. Örneğin:
ctx := context.Background()
// These will return error
err := gorm.G[User](db).Delete(ctx) // gorm.ErrMissingWhereClause
// These will work
err := gorm.G[User](db).Where("1 = 1").Delete(ctx)
// DELETE FROM `users` WHERE 1=1
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause hatası döndürür.
db.Delete(&[]User{{Name: "jinzhu1"}, {Name: "jinzhu2"}}).Error // gorm.ErrMissingWhereClause hatası döndürür.
db.Where("1 = 1").Delete(&User{})
// DELETE FROM `users` WHERE 1=1
db.Exec("DELETE FROM users")
// DELETE FROM users
db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&User{})
// DELETE FROM users
Silinen verileri döndür, yalnızca destekleyen veritabanları için döndürür, Örneğin:
// Bütün sütunları döndürür
var users []User
DB.Clauses(clause.Returning{}).Where("role = ?", "admin").Delete(&users)
// DELETE FROM `users` WHERE role = "admin" RETURNING *
// users => []User{{ID: 1, Name: "jinzhu", Role: "admin", Salary: 100}, {ID: 2, Name: "jinzhu.2", Role: "admin", Salary: 1000}}
// Belirtilen sütunları döndürür
DB.Clauses(clause.Returning{Columns: []clause.Column{{Name: "name"}, {Name: "salary"}}}).Where("role = ?", "admin").Delete(&users)
// DELETE FROM `users` WHERE role = "admin" RETURNING `name`, `salary`
// users => []User{{ID: 0, Name: "jinzhu", Role: "", Salary: 100}, {ID: 0, Name: "jinzhu.2", Role: "", Salary: 1000}}
Modeliniz bir gorm.DeletedAt alanı içeriyorsa (gorm.Model içinde yer alır), otomatik olarak geçici silme özelliğine sahip olur!
Delete çağrıldığında, kayıt veritabanından kaldırılmaz, ancak GORM DeletedAt'ın değerine silinme tarihi atanır. Veriler sorgularınızda gözükmezler.
// user's ID is `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// Toplu Silme
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// Sorgulama sırasında geçici silinen kayıtlar yok sayılır
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
gorm.Model'i dahil etmek istemiyorsanız, geçici silmeyi modelinize ekleyebilirsiniz. Örneğin:
type User struct {
ID int
Deleted gorm.DeletedAt
Name string
}
Geçici silinen kayıtları Unscoped ile bulabilirsiniz
db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;
Unscoped ile eşleşen kayıtları kalıcı olarak silebilirsiniz
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id=10;
Varsayılan olarak, gorm.Model DeletedAt alanı için değer olarak *time.Time kullanır.gorm.io/plugin/soft_delete eklentisi ise diğer veri türleri içinde destek sağlar
{% note warn %}
INFO DeletedAt alanı için benzersiz bileşik dizin oluştururken, gorm.io/plugin/soft_delete eklentisinin yardımıyla unix second/flag gibi diğer veri türleri kullanmalısınız, örn:
import "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string `gorm:"uniqueIndex:udx_name"`
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:udx_name"`
}
{% endnote %}
Delete Flag'de unix zamanı kullanma
import "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string
DeletedAt soft_delete.DeletedAt
}
// Query
SELECT * FROM users WHERE deleted_at = 0;
// Delete
UPDATE users SET deleted_at = /* current unix second */ WHERE ID = 1;
Değer olarak örneğin milli veya nano saniye kullanılmasını da belirtebilirsiniz:
type User struct {
ID uint
Name string
DeletedAt soft_delete.DeletedAt `gorm:"softDelete:milli"`
// DeletedAt soft_delete.DeletedAt `gorm:"softDelete:nano"`
}
// Query
SELECT * FROM users WHERE deleted_at = 0;
// Delete
UPDATE users SET deleted_at = /* geçerli zamana ait unix mili saniyesi veya nano saniyesi */ WHERE ID = 1;
1 / 0 kullanılmasıimport "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag"`
}
// Query
SELECT * FROM users WHERE is_del = 0;
// Delete
UPDATE users SET is_del = 1 WHERE ID = 1;
Karma mod, verileri silinmiş veya silinmemiş olarak işaretlemek ve aynı zamanda silinen zamanı kaydetmek için 0, 1 veya unix saniye kullanabilir.
type User struct {
ID uint
Name string
DeletedAt time.Time
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` // use `1` `0`
// IsDel soft_delete.DeletedAt `gorm:"softDelete:,DeletedAtField:DeletedAt"` // use `unix second`
// IsDel soft_delete.DeletedAt `gorm:"softDelete:nano,DeletedAtField:DeletedAt"` // use `unix nano second`
}
// Query
SELECT * FROM users WHERE is_del = 0;
// Delete
UPDATE users SET is_del = 1, deleted_at = /* current unix second */ WHERE ID = 1;