update auto migrate

This commit is contained in:
inkbx 2017-10-25 20:02:14 +08:00
parent 0a51f6cdc5
commit 0071d374f8
3 changed files with 15 additions and 1 deletions

View File

@ -33,6 +33,8 @@ type Dialect interface {
HasTable(tableName string) bool HasTable(tableName string) bool
// HasColumn check has column or not // HasColumn check has column or not
HasColumn(tableName string, columnName string) bool 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 return generated SQL with Limit and Offset, as mssql has special case
LimitAndOffsetSQL(limit, offset interface{}) string LimitAndOffsetSQL(limit, offset interface{}) string

View File

@ -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) 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 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) { func (s commonDialect) CurrentDatabase() (name string) {
s.db.QueryRow("SELECT DATABASE()").Scan(&name) s.db.QueryRow("SELECT DATABASE()").Scan(&name)

View File

@ -1185,8 +1185,14 @@ func (scope *Scope) autoMigrate() *Scope {
if !scope.Dialect().HasTable(tableName) { if !scope.Dialect().HasTable(tableName) {
scope.createTable() scope.createTable()
} else { } else {
columns := scope.Dialect().TableColumns(tableName)
columnsM := map[string]bool{}
for _, column := range columns {
columnsM[column] = true
}
for _, field := range scope.GetModelStruct().StructFields { for _, field := range scope.GetModelStruct().StructFields {
if !scope.Dialect().HasColumn(tableName, field.DBName) { if _, ok := columnsM[field.DBName]; !ok {
if field.IsNormal { if field.IsNormal {
sqlTag := scope.Dialect().DataTypeOf(field) sqlTag := scope.Dialect().DataTypeOf(field)
scope.Raw(fmt.Sprintf("ALTER TABLE %v ADD %v %v;", quotedTableName, scope.Quote(field.DBName), sqlTag)).Exec() scope.Raw(fmt.Sprintf("ALTER TABLE %v ADD %v %v;", quotedTableName, scope.Quote(field.DBName), sqlTag)).Exec()