GORM предоставляет некоторые интерфейсы, которые позволяют пользователям определять поддерживаемые типы данных для GORM, например json
Реализация настраиваемого типа данных
Scanner / Valuer
Настраиваемый тип данных должен реализовывать интерфейсы Scanner и Valuer, чтобы GORM знал, как получить/сохранить его в базе данных
Например:
type JSON json.RawMessage |
Существует много сторонних пакетов реализующих интерфейсы Scanner
/Valuer
, которые могут использоваться вместе с GORM, например:
import ( |
Интерфейс GormDataTypeInterface
GORM будет считывать тип столбца базы данных из тега type
, если он не найден, проверит, реализует ли структура интерфейс GormDBDataTypeInterface
или GormDataTypeInterface
и будет использовать его результат в качестве типа данных
type GormDataTypeInterface interface { |
Результат GormDataType
будет использован в качестве общего типа данных и может быть получен из поля DataType
типа schema.Field
, что может быть полезно при написании плагинов или хуков, например:
func (JSON) GormDataType() string { |
GormDBDataType
обычно возвращает правильный тип данных для текущего драйвера при миграции, например:
func (JSON) GormDBDataType(db *gorm.DB, field *schema.Field) string { |
Если в struct не реализует интерфейс GormDBDataTypeInterface
или GormDataTypeInterface
, GORM возьмет тип данных из первого поля struct, например, будет использовать string
для NullString
type NullString struct { |
Интерфейс GormValuerInterface
GORM предоставляет интерфейс GormValuerInterface
, который может позволить создавать/ обновлять из SQL-выражения или значения на основе контекста, например:
// GORM Valuer интерфейс |
Создание/Обновление из SQL-выражения
type Location struct { |
Вы также можете создать / обновить с помощью SQL-выражения из map, смотрите Создать из SQL-выражения и Обновить с помощью SQL-выражения для получения подробной информации
Значение на основе контекста
Если вы хотите создать или обновить значение в зависимости от текущего контекста, вы также можете реализовать интерфейс GormValuerInterface
, например:
type EncryptedString struct { |
Clause Expression
Если вы хотите собрать несколько помощников запросов, вы можете создать struct, который реализует интерфейс clause.Expression
:
type Expression interface { |
Смотрите JSON и SQL Builder для получения подробной информации, ниже приведен пример использования:
// Генерирует SQL-выражение с условием |
Настраиваемые наборы типов данных
Мы создали репозиторий Github для пользовательских коллекций типов данных https://github.com/go-gorm/datatypes , pull request приветствуется ;)