diff --git a/dialect.go b/dialect.go index e879588b..7a51601f 100644 --- a/dialect.go +++ b/dialect.go @@ -33,6 +33,8 @@ type Dialect interface { HasTable(tableName string) bool // HasColumn check has column or not HasColumn(tableName string, columnName string) bool + // TableColumns return all columns + TableColumns(tableName string) []string // LimitAndOffsetSQL return generated SQL with Limit and Offset, as mssql has special case LimitAndOffsetSQL(limit, offset interface{}) string diff --git a/dialect_common.go b/dialect_common.go index a99627f2..836a20e4 100644 --- a/dialect_common.go +++ b/dialect_common.go @@ -116,6 +116,12 @@ func (s commonDialect) HasColumn(tableName string, columnName string) bool { s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ? AND table_name = ? AND column_name = ?", s.CurrentDatabase(), tableName, columnName).Scan(&count) return count > 0 } +func (s commonDialect) TableColumns(tableName string) []string { + + var columns []string + s.db.QueryRow("SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ? AND table_name = ?", s.CurrentDatabase(), tableName).Scan(&colums) + return columns +} func (s commonDialect) CurrentDatabase() (name string) { s.db.QueryRow("SELECT DATABASE()").Scan(&name) diff --git a/scope.go b/scope.go index 51ebd5a0..c468047b 100644 --- a/scope.go +++ b/scope.go @@ -1185,8 +1185,14 @@ func (scope *Scope) autoMigrate() *Scope { if !scope.Dialect().HasTable(tableName) { scope.createTable() } else { + columns := scope.Dialect().TableColumns(tableName) + columnsM := map[string]bool{} + for _, column := range columns { + columnsM[column] = true + } + for _, field := range scope.GetModelStruct().StructFields { - if !scope.Dialect().HasColumn(tableName, field.DBName) { + if _, ok := columnsM[field.DBName]; !ok { if field.IsNormal { sqlTag := scope.Dialect().DataTypeOf(field) scope.Raw(fmt.Sprintf("ALTER TABLE %v ADD %v %v;", quotedTableName, scope.Quote(field.DBName), sqlTag)).Exec()