2016-12-09 2 views
1

Горм говорят в документации, что «определение Базовая модель gorm.Model, включая поля ID, CreatedAt, UpdatedAt, DeletedAt, вы можете вставлять его в вашей модели, или писать только те поля, которые вы хотите»:Нужно ли иметь два разных объекта для чтения и записи в моей базе данных с помощью gorm (golang)?

// Base Model's definition 
type Model struct { 
    ID  uint `gorm:"primary_key"` 
    CreatedAt time.Time 
    UpdatedAt time.Time 
    DeletedAt *time.Time 
} 

// Add fields `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 
type User struct { 
    gorm.Model 
    Name string 
} 

// Only need field `ID`, `CreatedAt` 
type User struct { 
    ID  uint 
    CreatedAt time.Time 
    Name  string 
} 

После документации, я ожидаю иметь только один определение пользователя, поэтому я создаю объект так:

type User struct { 
    gorm.Model 
    ID  uint 
    CreatedAt time.Time 
    Name  string 
} 

Но если я делаю DB.CreateTable(&User{}), я получаю следующие ошибки от Postgres:

(pq: column "id" specified more than once) 
(pq: column "created_at" specified more than once) 

Так что я должен иметь два разных объекта:

type CreateUser struct { 
    gorm.Model 
    Name string 
} 

type RetrieveUser struct { 
    gorm.Model 
    ID  uint 
    CreatedAt time.Time 
    Name  string 
} 

Так что я могу сделать DB.CreateTable(&CreateUser{})

Это очень некрасиво, и я должен быть что-то отсутствует, какие-либо идеи?

ответ

1

Хорошо, просто прочитайте код за gorm.Model, и я получил свой ответ.

type Model struct { 
    ID  uint `gorm:"primary_key"` 
    CreatedAt time.Time 
    UpdatedAt time.Time 
    DeletedAt *time.Time `sql:"index"` 
} 

Это означает, что я просто наклонился, как работает наследование!

+1

В Go нет наследования. Вы захотите посмотреть [Struct Embedding] (https://golang.org/doc/effective_go.html#embedding) – JimB

+0

Благодарим вас за эту важную точность! – Adrien