@@ -27,6 +27,8 @@ var regFullDataType = regexp.MustCompile(`\D*(\d+)\D?`)
2727
2828// TODO:? Create const vars for raw sql queries ?
2929
30+ var _ gorm.Migrator = (* Migrator )(nil )
31+
3032// Migrator m struct
3133type Migrator struct {
3234 Config
@@ -539,6 +541,26 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy
539541 return nil
540542}
541543
544+ func (m Migrator ) MigrateColumnUnique (value interface {}, field * schema.Field , columnType gorm.ColumnType ) error {
545+ unique , ok := columnType .Unique ()
546+ if ! ok || field .PrimaryKey {
547+ return nil // skip primary key
548+ }
549+ // By default, ColumnType's Unique is not affected by UniqueIndex, so we don't care about UniqueIndex.
550+ return m .RunWithValue (value , func (stmt * gorm.Statement ) error {
551+ // We're currently only receiving boolean values on `Unique` tag,
552+ // so the UniqueConstraint name is fixed
553+ constraint := m .DB .NamingStrategy .UniqueName (stmt .Table , field .DBName )
554+ if unique && ! field .Unique {
555+ return m .DB .Migrator ().DropConstraint (value , constraint )
556+ }
557+ if ! unique && field .Unique {
558+ return m .DB .Migrator ().CreateConstraint (value , constraint )
559+ }
560+ return nil
561+ })
562+ }
563+
542564// ColumnTypes return columnTypes []gorm.ColumnType and execErr error
543565func (m Migrator ) ColumnTypes (value interface {}) ([]gorm.ColumnType , error ) {
544566 columnTypes := make ([]gorm.ColumnType , 0 )
0 commit comments