Açıklama Yok
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.

mysql.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // mysql.go 根据//table_defintion.go 定义的表结构,编写mysql建立表和索引的代码。
  2. package generators
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. // MySQLGenerator MySQL SQL生成器
  8. type MySQLGenerator struct{}
  9. // NewMySQLGenerator 创建MySQL生成器实例
  10. func NewMySQLGenerator() *MySQLGenerator {
  11. return &MySQLGenerator{}
  12. }
  13. func (mg *MySQLGenerator) DBType() string {
  14. return "mysql"
  15. }
  16. func (mg *MySQLGenerator) TableExistsSQL(tableName string) string {
  17. return fmt.Sprintf(
  18. "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = '%s'",
  19. tableName,
  20. )
  21. }
  22. func (mg *MySQLGenerator) DropTableSQL(tableName string) string {
  23. return fmt.Sprintf("DROP TABLE IF EXISTS %s", tableName)
  24. }
  25. func (mg *MySQLGenerator) GenerateCreateTable(table TableDDL) string {
  26. if table.Schema == nil {
  27. return ""
  28. }
  29. var sql strings.Builder
  30. // 表头
  31. sql.WriteString(fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (\n", table.Name))
  32. // 列定义
  33. columns := table.Schema.Columns
  34. for i, col := range columns {
  35. sql.WriteString(fmt.Sprintf(" %s %s", col.Name, mg.getMySQLType(col)))
  36. // 添加选项
  37. for _, opt := range col.Options {
  38. sql.WriteString(" " + opt)
  39. }
  40. // 添加默认值
  41. if col.Default != "" {
  42. // 检查是否是函数调用(如CURRENT_TIMESTAMP)
  43. if strings.Contains(strings.ToUpper(col.Default), "CURRENT_TIMESTAMP") ||
  44. strings.Contains(strings.ToUpper(col.Default), "NOW()") {
  45. sql.WriteString(" DEFAULT " + col.Default)
  46. } else {
  47. sql.WriteString(fmt.Sprintf(" DEFAULT '%s'", col.Default))
  48. }
  49. }
  50. // 添加注释
  51. if col.Comment != "" {
  52. sql.WriteString(fmt.Sprintf(" COMMENT '%s'", col.Comment))
  53. }
  54. if i < len(columns)-1 {
  55. sql.WriteString(",")
  56. }
  57. sql.WriteString("\n")
  58. }
  59. // 添加索引(在MySQL中,索引可以在CREATE TABLE语句中定义)
  60. for _, idx := range table.Schema.Indexes {
  61. if idx.Unique {
  62. sql.WriteString(fmt.Sprintf(" ,UNIQUE KEY %s (%s)\n",
  63. idx.Name, strings.Join(idx.Columns, ", ")))
  64. } else {
  65. sql.WriteString(fmt.Sprintf(" ,KEY %s (%s)\n",
  66. idx.Name, strings.Join(idx.Columns, ", ")))
  67. }
  68. }
  69. sql.WriteString(")")
  70. // 表选项
  71. if table.Schema.Comment != "" {
  72. sql.WriteString(fmt.Sprintf(" COMMENT='%s'", table.Schema.Comment))
  73. }
  74. sql.WriteString(" ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;")
  75. return sql.String()
  76. }
  77. // getMySQLType 获取MySQL数据类型
  78. func (mg *MySQLGenerator) getMySQLType(col ColumnSchema) string {
  79. switch col.Type {
  80. case "DECIMAL":
  81. if col.Precision > 0 && col.Scale > 0 {
  82. return fmt.Sprintf("DECIMAL(%d,%d)", col.Precision, col.Scale)
  83. }
  84. return "DECIMAL"
  85. case "VARCHAR":
  86. if col.Length > 0 {
  87. return fmt.Sprintf("VARCHAR(%d)", col.Length)
  88. }
  89. return "VARCHAR(255)"
  90. case "CHAR":
  91. if col.Length > 0 {
  92. return fmt.Sprintf("CHAR(%d)", col.Length)
  93. }
  94. return "CHAR(1)"
  95. case "INT":
  96. return "INT"
  97. case "BIGINT":
  98. return "BIGINT"
  99. case "TINYINT":
  100. return "TINYINT"
  101. case "BOOL":
  102. return "TINYINT(1)"
  103. case "DATETIME":
  104. return "DATETIME"
  105. case "TIMESTAMP":
  106. return "TIMESTAMP"
  107. case "DATE":
  108. return "DATE"
  109. case "TIME":
  110. return "TIME"
  111. case "TEXT":
  112. return "TEXT"
  113. case "JSON":
  114. return "JSON"
  115. case "BLOB":
  116. return "BLOB"
  117. case "FLOAT":
  118. return "FLOAT"
  119. case "DOUBLE":
  120. return "DOUBLE"
  121. default:
  122. return col.Type
  123. }
  124. }
  125. func init() {
  126. RegisterGenerator(NewMySQLGenerator())
  127. }