2015-12-04 1 views
0

Почему gorm игнорирует sql:"index" теги? Никаких индексов не было создано.`gorm` Игнорирование` sql: "index" `Теги

Используемая база данных PostgreSQL (импорт _ "github.com/lib/pq"). Это Model структура используется (потому что по умолчанию gorm.Model использует номер автоматического приращения - serial - в качестве первичного ключа, и я хотел установить id себя):

type Model struct { 
    ID  int64 `sql:"type:bigint PRIMARY KEY;default:0"` 
    CreatedAt time.Time 
    UpdatedAt time.Time 
    DeletedAt *time.Time `sql:"index"` 
} 

и одна из актуальных моделей:

type TUHistory struct { 
    Model 

    TUID  int64 `json:"tu_id,string" gorm:"column:tu_id" sql:"index"` 
} 

func (x *TUHistory) TableName() string { 
    return "tu_history" 
} 

И таблица создается db.CreateTable(&TUHistory{}), которая корректно создает таблицу, за исключением индексов.

Как временная работа, я делаю db.Model(&TUHistory{}).AddIndex("ix_tuh_tu_id", "tu_id") для создания индексов.

ответ

1

Из моего опыта, db.CreateTable создает только таблицу и ее поля. Вы лучше использовать функцию AutoMigrate с модельной структурой, которую вы хотите перенести:

db, err := gorm.Open("postgres", connectionString) 
... 
// error checking 
... 

db.AutoMigrate(&Model) 

Кроме того, я попытался AutoMigrating модели отправил и получил ошибку о том, что несколько первичных ключей не допускается, поэтому я изменил модель до:

type Model struct { 
    Id  int64 `sql:"type:bigint;default:0"` 
    CreatedAt time.Time 
    UpdatedAt time.Time 
    DeletedAt *time.Time `sql:"index"` 
} 

и AutoMigration создавали все ПК и индексы просто отлично.

Edit:

Проверка README в Горм, на долю этой example, то почта структура идет как:

type Email struct { 
    ID  int 
    UserID int  `sql:"index"` // Foreign key (belongs to), tag `index` will create index for this field when using AutoMigrate 
    Email string `sql:"type:varchar(100);unique_index"` // Set field's sql type, tag `unique_index` will create unique index 
    Subscribed bool 
} 

Обратите внимание на комментарий на поле USERID говоря, что это создаст индекс при использовании AutoMigrate ,

Кроме того, стоит взглянуть на то, как AutoMigrate делает его работу:

// Automating Migration 
db.AutoMigrate(&User{}) 
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}) 
db.AutoMigrate(&User{}, &Product{}, &Order{}) 
// Feel free to change your struct, AutoMigrate will keep your database up-to-date. 
// AutoMigrate will ONLY add *new columns* and *new indexes*, 
// WON'T update current column's type or delete unused columns, to protect your data. 
// If the table is not existing, AutoMigrate will create the table automatically. 
Смежные вопросы