`gorm` 忽略 `sql:"index"` 标签
`gorm` Ignoring `sql:"index"` Tags
为什么 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"
}
并且 table 是由 db.CreateTable(&TUHistory{})
创建的,它正确地创建了 table 除了索引。
作为临时解决方法,我 db.Model(&TUHistory{}).AddIndex("ix_tuh_tu_id", "tu_id")
创建索引。
根据我的经验,db.CreateTable 只会创建 table 及其字段。您最好对要迁移的模型结构使用 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,在这个 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.
为什么 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"
}
并且 table 是由 db.CreateTable(&TUHistory{})
创建的,它正确地创建了 table 除了索引。
作为临时解决方法,我 db.Model(&TUHistory{}).AddIndex("ix_tuh_tu_id", "tu_id")
创建索引。
根据我的经验,db.CreateTable 只会创建 table 及其字段。您最好对要迁移的模型结构使用 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,在这个 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.