@@ -27,6 +27,8 @@ var regFullDataType = regexp.MustCompile(`\D*(\d+)\D?`)
27
27
28
28
// TODO:? Create const vars for raw sql queries ?
29
29
30
+ var _ gorm.Migrator = (* Migrator )(nil )
31
+
30
32
// Migrator m struct
31
33
type Migrator struct {
32
34
Config
@@ -539,6 +541,26 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy
539
541
return nil
540
542
}
541
543
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
+
542
564
// ColumnTypes return columnTypes []gorm.ColumnType and execErr error
543
565
func (m Migrator ) ColumnTypes (value interface {}) ([]gorm.ColumnType , error ) {
544
566
columnTypes := make ([]gorm.ColumnType , 0 )
0 commit comments