Как удалить таблицу со связями в ГОРМ?

Я удалил объект и хочу, чтобы его идентификатор тоже был удален из таблицы отношений. Как мне это сделать? т.е. объекты с отношениями удаляются, но таблицы их отношений остаются.

введите здесь описание изображения

Также хотел спросить, GORM - лучшее решение ORM для Go-Gin?


person ATkisai    schedule 19.04.2019    source источник
comment
Я думаю, вы спрашиваете о каскадных удалениях что больше о SQL, чем о Go, но я не уверен. Вы можете привести более конкретный пример? Что касается вопроса о лучшем инструменте, мы избегаем вопросов наилучшего / любимого типа; ответ зависит от того, что вы делаете.   -  person Schwern    schedule 19.04.2019
comment
Я оговорился, ORM могут выполнять свои собственные каскадные удаления. Не знаю, сможет ли ГОРМ.   -  person Schwern    schedule 19.04.2019
comment
Есть таблицы, в которых отношения объектов регистрируются с помощью их id. При удалении объектов эти отношения сохраняются, тем самым просто занимая место на сервере. Я не знаю, как получить доступ к этим таблицам из кода, чтобы удалить их вручную, поскольку эти таблицы создаются автоматически и не присутствуют в моих моделях.   -  person ATkisai    schedule 19.04.2019
comment
Отношения между объектами, зарегистрированными по их идентификатору, звучат как внешние ключи. Но похоже, что ваша схема неправильно объявляет свои внешние ключи. К сожалению, это обычное дело. Внешние ключи не позволят вам удалить объект, оставив при этом ссылки. Объявление внешних ключей как при каскаде удаления приведет к удалению ссылающихся строк при удалении первичного объекта. Я бы посоветовал вам прочитать учебник по SQL по каскадному удалению.   -  person Schwern    schedule 20.04.2019


Ответы (1)


Попробуйте явно добавить к своим моделям внешние ключи и ON DELETE CASCADE. Я обнаружил, что GORM может быть ненадежным, когда он подходит к подобным вещам, но если делать это явно, кажется, что он всегда работает.

Например:

type Person struct {
    ID      int
    Bio     Biography `gorm:"Foreignkey:PersonID;"`
    Name    string
}

type Biography struct {
    ID       int
    Content  string
    PersonID int    `sql:"type:bigint REFERENCES people(id) ON DELETE CASCADE"`
}

Примечание: вы должны указать, как будут называться фактические столбец и таблица базы данных, а не поле. Поскольку GORM автоматически формирует множественное число и преобразует таблицы в snake_case, я ссылаюсь на столбец people(id). Если вы перезаписываете эту функцию, используйте любое имя таблицы и столбца, которое у вас есть.

person robbieperry22    schedule 23.04.2019