Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // sql_generator.go 根据数据库类型,自动选择对应注册的建立表的sql编写器,进行编写。
  2. package generators
  3. import (
  4. "fmt"
  5. "strings"
  6. "sync"
  7. )
  8. // ColumnSchema 列结构定义
  9. type ColumnSchema struct {
  10. Name string
  11. ChineseName string // 新增:字段中文名称
  12. Aliases []string // 新增:字段别名列表
  13. Type string // 基本类型:VARCHAR, INT, DECIMAL 等
  14. Length int // 长度
  15. Precision int // 精度(用于 DECIMAL)
  16. Scale int // 小数位数(用于 DECIMAL)
  17. Comment string
  18. Options []string // 选项:NOT NULL, PRIMARY KEY 等
  19. Default string // 默认值字符串
  20. }
  21. // IndexSchema 索引结构定义
  22. type IndexSchema struct {
  23. Name string
  24. Columns []string
  25. Unique bool
  26. }
  27. // TableSchema 表结构定义
  28. type TableSchema struct {
  29. Name string
  30. ChineseName string // 新增:表中文名称
  31. Aliases []string // 新增:表别名列表
  32. Comment string
  33. Columns []ColumnSchema
  34. Indexes []IndexSchema
  35. }
  36. // TableDDL 表定义
  37. type TableDDL struct {
  38. Name string
  39. SQL string
  40. Comment string
  41. Schema *TableSchema // 新增Schema字段
  42. }
  43. // SQLGenerator SQL生成器接口
  44. type SQLGenerator interface {
  45. // 生成检查表是否存在的SQL
  46. TableExistsSQL(tableName string) string
  47. // 生成删除表的SQL
  48. DropTableSQL(tableName string) string
  49. // 生成创建表的SQL
  50. GenerateCreateTable(table TableDDL) string
  51. // 获取数据库类型
  52. DBType() string
  53. }
  54. // SQLGeneratorRegistry SQL生成器注册表
  55. type SQLGeneratorRegistry struct {
  56. generators map[string]SQLGenerator
  57. mu sync.RWMutex
  58. }
  59. var (
  60. globalGeneratorRegistry *SQLGeneratorRegistry
  61. generatorRegistryOnce sync.Once
  62. )
  63. // GetSQLGeneratorRegistry 获取SQL生成器注册表单例
  64. func GetSQLGeneratorRegistry() *SQLGeneratorRegistry {
  65. generatorRegistryOnce.Do(func() {
  66. globalGeneratorRegistry = &SQLGeneratorRegistry{
  67. generators: make(map[string]SQLGenerator),
  68. }
  69. })
  70. return globalGeneratorRegistry
  71. }
  72. // RegisterGenerator 注册SQL生成器
  73. func (r *SQLGeneratorRegistry) RegisterGenerator(generator SQLGenerator) {
  74. r.mu.Lock()
  75. defer r.mu.Unlock()
  76. dbType := strings.ToLower(generator.DBType())
  77. r.generators[dbType] = generator
  78. }
  79. // GetGenerator 获取SQL生成器
  80. func (r *SQLGeneratorRegistry) GetGenerator(dbType string) (SQLGenerator, error) {
  81. r.mu.RLock()
  82. defer r.mu.RUnlock()
  83. generator, exists := r.generators[strings.ToLower(dbType)]
  84. if !exists {
  85. return nil, fmt.Errorf("不支持的数据类型: %s,已注册的类型: %v", dbType, r.GetRegisteredTypes())
  86. }
  87. return generator, nil
  88. }
  89. // GetRegisteredTypes 获取已注册的数据库类型
  90. func (r *SQLGeneratorRegistry) GetRegisteredTypes() []string {
  91. r.mu.RLock()
  92. defer r.mu.RUnlock()
  93. types := make([]string, 0, len(r.generators))
  94. for dbType := range r.generators {
  95. types = append(types, dbType)
  96. }
  97. return types
  98. }
  99. // 包级便捷函数
  100. // RegisterGenerator 包级便捷函数:注册SQL生成器
  101. func RegisterGenerator(generator SQLGenerator) {
  102. GetSQLGeneratorRegistry().RegisterGenerator(generator)
  103. }
  104. // GetGenerator 包级便捷函数:获取SQL生成器
  105. func GetGenerator(dbType string) (SQLGenerator, error) {
  106. return GetSQLGeneratorRegistry().GetGenerator(dbType)
  107. }
  108. // GetAllGenerators 获取所有已注册的生成器
  109. func GetAllGenerators() []SQLGenerator {
  110. registry := GetSQLGeneratorRegistry()
  111. registry.mu.RLock()
  112. defer registry.mu.RUnlock()
  113. generators := make([]SQLGenerator, 0, len(registry.generators))
  114. for _, generator := range registry.generators {
  115. generators = append(generators, generator)
  116. }
  117. return generators
  118. }