Bez popisu
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.

table_create.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // table_create.go 执行建表代码
  2. package sqldef
  3. import (
  4. "fmt"
  5. "log"
  6. "git.x2erp.com/qdy/go-db/sqldef/generators"
  7. "github.com/jmoiron/sqlx"
  8. )
  9. // TableSyncer 表同步器
  10. type TableSyncer struct {
  11. db *sqlx.DB
  12. dbType string
  13. generator generators.SQLGenerator
  14. }
  15. // NewTableSyncer 创建表同步器
  16. func NewTableSyncer(db *sqlx.DB, dbType string) (*TableSyncer, error) {
  17. // 获取SQL生成器
  18. generator, err := generators.GetGenerator(dbType)
  19. if err != nil {
  20. return nil, fmt.Errorf("获取SQL生成器失败: %w", err)
  21. }
  22. return &TableSyncer{
  23. db: db,
  24. dbType: dbType,
  25. generator: generator,
  26. }, nil
  27. }
  28. // CreateAllTables 同步所有注册的表
  29. // recreate: true - 表存在则删除重建;false - 表不存在则创建
  30. func (ts *TableSyncer) createAllTables(recreate bool) error {
  31. // 确保注册表已初始化
  32. globalRegistry.ensureInit()
  33. // 测试数据库连接
  34. if err := ts.db.Ping(); err != nil {
  35. return fmt.Errorf("数据库连接失败: %w", err)
  36. }
  37. // 获取所有注册的表定义
  38. tables := GetAll()
  39. log.Printf("开始创建 %d 个表到 %s 数据库...\n", len(tables), ts.dbType)
  40. // 处理每个表
  41. for i, table := range tables {
  42. tableName := table.Name
  43. // 检查表是否存在
  44. exists, err := ts.tableExists(tableName)
  45. if err != nil {
  46. return fmt.Errorf("检查表 %s 是否存在失败: %w", tableName, err)
  47. }
  48. if recreate {
  49. // 如果存在则删除
  50. if exists {
  51. if err := ts.dropTable(tableName); err != nil {
  52. return fmt.Errorf("删除表 %s 失败: %w", tableName, err)
  53. }
  54. log.Printf("[%d/%d] 表 %s 已删除\n", i+1, len(tables), tableName)
  55. }
  56. // 创建表
  57. if err := ts.createTable(table); err != nil {
  58. return fmt.Errorf("创建表 %s 失败: %w", tableName, err)
  59. }
  60. // 修正:Go没有三元运算符,使用if-else
  61. var action string
  62. if exists {
  63. action = "重建"
  64. } else {
  65. action = "创建"
  66. }
  67. log.Printf("[%d/%d] 表 %s 已%s\n", i+1, len(tables), tableName, action)
  68. } else {
  69. // 只创建不存在的表
  70. if !exists {
  71. if err := ts.createTable(table); err != nil {
  72. return fmt.Errorf("创建表 %s 失败: %w", tableName, err)
  73. }
  74. log.Printf("[%d/%d] 表 %s 已创建\n", i+1, len(tables), tableName)
  75. } else {
  76. log.Printf("[%d/%d] 表 %s 已存在,跳过\n", i+1, len(tables), tableName)
  77. }
  78. }
  79. }
  80. log.Println("所有表创建完成!")
  81. return nil
  82. }
  83. // tableExists 检查表是否存在
  84. func (ts *TableSyncer) tableExists(tableName string) (bool, error) {
  85. sql := ts.generator.TableExistsSQL(tableName)
  86. var exists bool
  87. if ts.dbType == "postgresql" {
  88. // PostgreSQL返回boolean
  89. err := ts.db.QueryRow(sql).Scan(&exists)
  90. return exists, err
  91. } else {
  92. // MySQL返回count
  93. var count int
  94. err := ts.db.QueryRow(sql).Scan(&count)
  95. return count > 0, err
  96. }
  97. }
  98. // dropTable 删除表
  99. func (ts *TableSyncer) dropTable(tableName string) error {
  100. sql := ts.generator.DropTableSQL(tableName)
  101. _, err := ts.db.Exec(sql)
  102. return err
  103. }
  104. // createTable 创建表
  105. func (ts *TableSyncer) createTable(table generators.TableDDL) error {
  106. // 使用生成器生成适合当前数据库的SQL
  107. sql := ts.generator.GenerateCreateTable(table)
  108. // 打印SQL用于调试
  109. log.Printf("执行SQL: %s", sql)
  110. _, err := ts.db.Exec(sql)
  111. if err != nil {
  112. // 记录详细的错误信息
  113. log.Printf("执行SQL失败: %v", err)
  114. return fmt.Errorf("执行SQL失败: %w", err)
  115. }
  116. return nil
  117. }
  118. // SyncTables 同步所有表
  119. func syncTables(db *sqlx.DB, dbType string, recreate bool) error {
  120. syncer, err := NewTableSyncer(db, dbType)
  121. if err != nil {
  122. return err
  123. }
  124. return syncer.createAllTables(recreate)
  125. }
  126. // // CreateTables 创建所有不存在的表
  127. // func CreateTables(db *sqlx.DB, dbType string) error {
  128. // return syncTables(db, dbType, false)
  129. // }
  130. // // RecreateTables 重建所有表
  131. // func RecreateTables(db *sqlx.DB, dbType string) error {
  132. // return syncTables(db, dbType, true)
  133. // }
  134. // CreateTables 创建所有不存在的表
  135. func (ts *TableSyncer) CreateTables() error {
  136. return ts.createAllTables(false)
  137. }
  138. // RecreateTables 重建所有表
  139. func (ts *TableSyncer) RecreateTables() error {
  140. return ts.createAllTables(true)
  141. }