1

为什么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")创建索引。

4

1 回答 1

2

根据我的经验, db.CreateTable 仅创建表及其字段。最好将 AutoMigrate 函数与要迁移的模型结构一起使用:

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

db.AutoMigrate(&Model)

另外,我尝试自动迁移您发布的模型并收到一条错误消息,指出不允许使用多个主键,因此我将模型更改为:

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

并且 AutoMigration 很好地创建了所有 PK 和索引。

编辑:

检查 GORM 的 README,在这个例子中,电子邮件结构如下:

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.
于 2015-12-04T16:05:03.697 回答