dialect.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package migrations
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type Dialect interface {
  7. DriverName() string
  8. QuoteStr() string
  9. Quote(string) string
  10. AndStr() string
  11. AutoIncrStr() string
  12. OrStr() string
  13. EqStr() string
  14. ShowCreateNull() bool
  15. SqlType(col *Column) string
  16. CreateIndexSql(tableName string, index *Index) string
  17. CreateTableSql(table *Table) string
  18. AddColumnSql(tableName string, Col *Column) string
  19. TableCheckSql(tableName string) (string, []interface{})
  20. }
  21. type BaseDialect struct {
  22. dialect Dialect
  23. driverName string
  24. }
  25. func (d *BaseDialect) DriverName() string {
  26. return d.driverName
  27. }
  28. func (b *BaseDialect) ShowCreateNull() bool {
  29. return true
  30. }
  31. func (b *BaseDialect) AndStr() string {
  32. return "AND"
  33. }
  34. func (b *BaseDialect) OrStr() string {
  35. return "OR"
  36. }
  37. func (b *BaseDialect) EqStr() string {
  38. return "="
  39. }
  40. func (b *BaseDialect) CreateTableSql(table *Table) string {
  41. var sql string
  42. sql = "CREATE TABLE IF NOT EXISTS "
  43. sql += b.dialect.Quote(table.Name) + " (\n"
  44. pkList := table.PrimaryKeys
  45. for _, col := range table.Columns {
  46. if col.IsPrimaryKey && len(pkList) == 1 {
  47. sql += col.String(b.dialect)
  48. } else {
  49. sql += col.StringNoPk(b.dialect)
  50. }
  51. sql = strings.TrimSpace(sql)
  52. sql += "\n, "
  53. }
  54. if len(pkList) > 1 {
  55. sql += "PRIMARY KEY ( "
  56. sql += b.dialect.Quote(strings.Join(pkList, b.dialect.Quote(",")))
  57. sql += " ), "
  58. }
  59. sql = sql[:len(sql)-2] + ")"
  60. sql += ";"
  61. return sql
  62. }
  63. func (db *BaseDialect) AddColumnSql(tableName string, col *Column) string {
  64. return fmt.Sprintf("alter table %s ADD COLUMN %s", tableName, col.StringNoPk(db.dialect))
  65. }
  66. func (db *BaseDialect) CreateIndexSql(tableName string, index *Index) string {
  67. quote := db.dialect.Quote
  68. var unique string
  69. var idxName string
  70. if index.Type == UniqueIndex {
  71. unique = " UNIQUE"
  72. idxName = fmt.Sprintf("UQE_%v_%v", tableName, index.Name)
  73. } else {
  74. idxName = fmt.Sprintf("IDX_%v_%v", tableName, index.Name)
  75. }
  76. return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v);", unique,
  77. quote(idxName), quote(tableName),
  78. quote(strings.Join(index.Cols, quote(","))))
  79. }