A clean, Markdown-based publishing platform made for writers. Write together, and build a community. https://writefreely.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

53 lines
1.2 KiB

  1. package db
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type AlterTableSqlBuilder struct {
  7. Dialect DialectType
  8. Name string
  9. Changes []string
  10. }
  11. func (b *AlterTableSqlBuilder) AddColumn(col *Column) *AlterTableSqlBuilder {
  12. if colVal, err := col.String(); err == nil {
  13. b.Changes = append(b.Changes, fmt.Sprintf("ADD COLUMN %s", colVal))
  14. }
  15. return b
  16. }
  17. func (b *AlterTableSqlBuilder) ChangeColumn(name string, col *Column) *AlterTableSqlBuilder {
  18. if colVal, err := col.String(); err == nil {
  19. b.Changes = append(b.Changes, fmt.Sprintf("CHANGE COLUMN %s %s", name, colVal))
  20. }
  21. return b
  22. }
  23. func (b *AlterTableSqlBuilder) AddUniqueConstraint(name string, columns ...string) *AlterTableSqlBuilder {
  24. b.Changes = append(b.Changes, fmt.Sprintf("ADD CONSTRAINT %s UNIQUE (%s)", name, strings.Join(columns, ", ")))
  25. return b
  26. }
  27. func (b *AlterTableSqlBuilder) ToSQL() (string, error) {
  28. var str strings.Builder
  29. str.WriteString("ALTER TABLE ")
  30. str.WriteString(b.Name)
  31. str.WriteString(" ")
  32. if len(b.Changes) == 0 {
  33. return "", fmt.Errorf("no changes provide for table: %s", b.Name)
  34. }
  35. changeCount := len(b.Changes)
  36. for i, thing := range b.Changes {
  37. str.WriteString(thing)
  38. if i < changeCount-1 {
  39. str.WriteString(", ")
  40. }
  41. }
  42. return str.String(), nil
  43. }