Nessuna descrizione
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.

sql_generator.go 3.4KB

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