package db import ( "fmt" "strings" ) type AlterTableSqlBuilder struct { Dialect DialectType Name string Changes []string } func (b *AlterTableSqlBuilder) AddColumn(col *Column) *AlterTableSqlBuilder { if colVal, err := col.String(); err == nil { b.Changes = append(b.Changes, fmt.Sprintf("ADD COLUMN %s", colVal)) } return b } func (b *AlterTableSqlBuilder) ChangeColumn(name string, col *Column) *AlterTableSqlBuilder { if colVal, err := col.String(); err == nil { b.Changes = append(b.Changes, fmt.Sprintf("CHANGE COLUMN %s %s", name, colVal)) } return b } func (b *AlterTableSqlBuilder) AddUniqueConstraint(name string, columns ...string) *AlterTableSqlBuilder { b.Changes = append(b.Changes, fmt.Sprintf("ADD CONSTRAINT %s UNIQUE (%s)", name, strings.Join(columns, ", "))) return b } func (b *AlterTableSqlBuilder) ToSQL() (string, error) { var str strings.Builder str.WriteString("ALTER TABLE ") str.WriteString(b.Name) str.WriteString(" ") if len(b.Changes) == 0 { return "", fmt.Errorf("no changes provide for table: %s", b.Name) } changeCount := len(b.Changes) for i, thing := range b.Changes { str.WriteString(thing) if i < changeCount-1 { str.WriteString(", ") } } return str.String(), nil }