Skip to content

Commit a4858c5

Browse files
warren830jinzhu
andauthored
add USING ?::? to AlterColumn (go-gorm#105)
Co-authored-by: Jinzhu <wosmvp@gmail.com>
1 parent 096c357 commit a4858c5

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

migrator.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -279,31 +279,35 @@ func (m Migrator) AlterColumn(value interface{}, field string) error {
279279
}
280280
}
281281

282-
fileType := clause.Expr{SQL: m.DataTypeOf(field)}
283-
if fieldColumnType.DatabaseTypeName() != fileType.SQL {
284-
filedColumnAutoIncrement, _ := fieldColumnType.AutoIncrement()
285-
if field.AutoIncrement && filedColumnAutoIncrement { // update
286-
serialDatabaseType, _ := getSerialDatabaseType(fileType.SQL)
287-
if t, _ := fieldColumnType.ColumnType(); t != serialDatabaseType {
288-
if err := m.UpdateSequence(m.DB, stmt, field, serialDatabaseType); err != nil {
282+
return m.DB.Connection(func(tx *gorm.DB) error {
283+
fileType := clause.Expr{SQL: m.DataTypeOf(field)}
284+
if fieldColumnType.DatabaseTypeName() != fileType.SQL {
285+
filedColumnAutoIncrement, _ := fieldColumnType.AutoIncrement()
286+
if field.AutoIncrement && filedColumnAutoIncrement { // update
287+
serialDatabaseType, _ := getSerialDatabaseType(fileType.SQL)
288+
if t, _ := fieldColumnType.ColumnType(); t != serialDatabaseType {
289+
if err := m.UpdateSequence(tx, stmt, field, serialDatabaseType); err != nil {
290+
return err
291+
}
292+
}
293+
} else if field.AutoIncrement && !filedColumnAutoIncrement { // create
294+
serialDatabaseType, _ := getSerialDatabaseType(fileType.SQL)
295+
if err := m.CreateSequence(tx, stmt, field, serialDatabaseType); err != nil {
296+
return err
297+
}
298+
} else if !field.AutoIncrement && filedColumnAutoIncrement { // delete
299+
if err := m.DeleteSequence(tx, stmt, field, fileType); err != nil {
300+
return err
301+
}
302+
} else {
303+
if err := tx.Exec("ALTER TABLE ? ALTER COLUMN ? TYPE ? USING ?::?",
304+
m.CurrentTable(stmt), clause.Column{Name: field.DBName}, fileType, clause.Column{Name: field.DBName}, fileType).Error; err != nil {
289305
return err
290306
}
291-
}
292-
} else if field.AutoIncrement && !filedColumnAutoIncrement { // create
293-
serialDatabaseType, _ := getSerialDatabaseType(fileType.SQL)
294-
if err := m.CreateSequence(m.DB, stmt, field, serialDatabaseType); err != nil {
295-
return err
296-
}
297-
} else if !field.AutoIncrement && filedColumnAutoIncrement { // delete
298-
if err := m.DeleteSequence(m.DB, stmt, field, fileType); err != nil {
299-
return err
300-
}
301-
} else {
302-
if err := m.DB.Exec("ALTER TABLE ? ALTER COLUMN ? TYPE ?", m.CurrentTable(stmt), clause.Column{Name: field.DBName}, fileType).Error; err != nil {
303-
return err
304307
}
305308
}
306-
}
309+
return nil
310+
})
307311

308312
if null, _ := fieldColumnType.Nullable(); null == field.NotNull {
309313
if field.NotNull {
@@ -691,4 +695,4 @@ func groupByIndexName(indexList []*Index) map[string][]*Index {
691695

692696
func (m Migrator) GetTypeAliases(databaseTypeName string) []string {
693697
return typeAliasMap[databaseTypeName]
694-
}
698+
}

0 commit comments

Comments
 (0)