diff --git a/README.md b/README.md index 71dad237..cecff94d 100644 --- a/README.md +++ b/README.md @@ -923,6 +923,16 @@ for rows.Next() { db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results) ``` +## Indices + +```go +// single column index +db.Model(User{}).AddIndex("idx_user_name", "name") + +// multiple column index +db.Model(User{}).AddIndex("idx_user_name", "name", "age") +``` + ## Run Raw SQL ```go @@ -1032,7 +1042,7 @@ db.Where("email = ?", "x@example.org").Attrs(User{RegisteredIp: "111.111.111.111 share or not? transaction? * Github Pages * Includes -* AlertColumn, DropColumn, AddIndex, RemoveIndex +* AlertColumn, DropColumn # Author diff --git a/main.go b/main.go index 24f67621..1c99150d 100644 --- a/main.go +++ b/main.go @@ -314,8 +314,8 @@ func (s *DB) DropColumn(column string) *DB { return s } -func (s *DB) AddIndex(column string, indexName ...string) *DB { - s.clone().NewScope(s.Value).addIndex(column, indexName...) +func (s *DB) AddIndex(indexName string, column ...string) *DB { + s.clone().NewScope(s.Value).addIndex(indexName, column...) return s } diff --git a/main_test.go b/main_test.go index 7f7321f5..00796db9 100644 --- a/main_test.go +++ b/main_test.go @@ -83,6 +83,16 @@ type User struct { IgnoreStringSlice []string `sql:"-"` } +type UserCompany struct { + Id int64 + UserId int64 + CompanyId int64 +} + +func (t UserCompany) TableName() string { + return "user_companies" +} + type CreditCard struct { Id int8 Number string @@ -179,6 +189,7 @@ func init() { db.Exec("drop table roles") db.Exec("drop table companies") db.Exec("drop table animals") + db.Exec("drop table user_companies") if err = db.CreateTable(&Animal{}).Error; err != nil { panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) @@ -212,6 +223,10 @@ func init() { panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) } + if err = db.AutoMigrate(UserCompany{}).Error; err != nil { + panic(fmt.Sprintf("No error should happen when create table, but got %+v", err)) + } + var shortForm = "2006-01-02 15:04:05" t1, _ = time.Parse(shortForm, "2000-10-27 12:02:40") t2, _ = time.Parse(shortForm, "2002-01-01 00:00:00") @@ -2003,3 +2018,15 @@ func TestSelectWithEscapedFieldName(t *testing.T) { t.Errorf("Expected one name, but got: %d", len(names)) } } + +func TestIndices(t *testing.T) { + if err := db.Model(&UserCompany{}).AddIndex("idx_user_company_user", "user_id").Error; err != nil { + t.Errorf("Got error when tried to create index: %+v", err) + } + if err := db.Model(&UserCompany{}).RemoveIndex("idx_user_company_user").Error; err != nil { + t.Errorf("Got error when tried to remove index: %+v", err) + } + if err := db.Model(&UserCompany{}).AddIndex("idx_user_company_user_company", "user_id", "company_id").Error; err != nil { + t.Errorf("Got error when tried to create index: %+v", err) + } +} diff --git a/scope_private.go b/scope_private.go index 2b39dddb..8bfbf437 100644 --- a/scope_private.go +++ b/scope_private.go @@ -431,15 +431,13 @@ func (scope *Scope) dropColumn(column string) { scope.Raw(fmt.Sprintf("ALTER TABLE %v DROP COLUMN %v", scope.Quote(scope.TableName()), scope.Quote(column))).Exec() } -func (scope *Scope) addIndex(column string, names ...string) { - var indexName string - if len(names) > 0 { - indexName = names[0] - } else { - indexName = fmt.Sprintf("index_%v_on_%v", scope.TableName(), column) +func (scope *Scope) addIndex(indexName string, column ...string) { + var columns []string + for _, name := range column { + columns = append(columns, scope.Quote(name)) } - scope.Raw(fmt.Sprintf("CREATE INDEX %v ON %v(%v);", indexName, scope.Quote(scope.TableName()), scope.Quote(column))).Exec() + scope.Raw(fmt.Sprintf("CREATE INDEX %v ON %v(%v);", indexName, scope.Quote(scope.TableName()), strings.Join(columns, ", "))).Exec() } func (scope *Scope) removeIndex(indexName string) {