Search code examples
gogo-gorm

How to prevent Child models from Deletion in Golang GORM?


Well, I would like to know, Is there any solutions, how to prevent Child Model from deletion in foreignKey Constraint, (

For example in gorm there is a couple of options that allows to restrict behavior of the Parent Model after deletion, and Delete or Set to Null the Child Model Objects That has foreignKey relation (onDelete: Cascade / Set Null, and the same thing for onUpdate)

// Pretty a lot of the same words, but I hope you got it :)

Little Example.. from Golang ...


type SomeOtherStruct struct {
     gorm.Model
     Id int 

} 

type SomeModel struct {
    gorm.Model
    someOtherStructId string 

    someField SomeOtherStruct `gorm:"foreignKey:SomeOtherStructId; OnDelete:Cascade,OnUpdate: SET NULL"` // basically foreign Key Relationship to model `SomeOtherStruct`
}

But I would like to prevent any Update/Deletion behavior, so Child Relation Models Objects won't get deleted after the Parent Model Object has been..

There is actually a concept from Django Framework (Python)

class SomeModel(models.Model):
     
    some_field = models.ForeignKey(to=AnotherModel,   verbose_name="SomeField", on_delete=models.PROTECT) 

class AnotherModel(models.Model):
     pass 

As you can see, there is models.PROTECT constraint, that is basically what I'm looking for....

Is there any analogy for that in Golang GORM or some RAW SQL for that as well?

Thanks..


Solution

  • Unfortunately, you didn't mention which database you are using.

    In Postgres (as an example) there are multiple options for ON DELETE:

    • NO ACTION
    • RESTRICT
    • CASCADE
    • SET NULL
    • SET DEFAULT

    Only CASCADE will delete children if the parent is deleted. All other options (including the default NO ACTION) will make sure the children will "survive".

    You can find more information in the postgres documentation: https://www.postgresql.org/docs/current/sql-createtable.html

    Please feel free to update your question and/or comment with the database you are using.