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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package factory
  2. import (
  3. "database/sql"
  4. "fmt"
  5. )
  6. // ExecuteDDL 执行DDL语句(创建、删除、更新表等)
  7. func (f *DBFactory) ExecuteDDL(db *sql.DB, ddlSQL string) error {
  8. if db == nil {
  9. return fmt.Errorf("database connection is nil")
  10. }
  11. if ddlSQL == "" {
  12. return fmt.Errorf("DDL SQL statement is empty")
  13. }
  14. // 执行DDL语句
  15. _, err := db.Exec(ddlSQL)
  16. if err != nil {
  17. return fmt.Errorf("failed to execute DDL: %v", err)
  18. }
  19. return nil
  20. }
  21. // ExecuteDDLWithTx 在事务中执行DDL语句
  22. func (f *DBFactory) ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
  23. if db == nil {
  24. return fmt.Errorf("database connection is nil")
  25. }
  26. if ddlSQL == "" {
  27. return fmt.Errorf("DDL SQL statement is empty")
  28. }
  29. // 开始事务
  30. tx, err := db.Begin()
  31. if err != nil {
  32. return fmt.Errorf("failed to begin transaction: %v", err)
  33. }
  34. // 执行DDL语句
  35. _, err = tx.Exec(ddlSQL)
  36. if err != nil {
  37. // 回滚事务
  38. tx.Rollback()
  39. return fmt.Errorf("failed to execute DDL in transaction: %v", err)
  40. }
  41. // 提交事务
  42. if err := tx.Commit(); err != nil {
  43. return fmt.Errorf("failed to commit transaction: %v", err)
  44. }
  45. return nil
  46. }
  47. // ExecuteMultipleDDL 执行多个DDL语句
  48. func (f *DBFactory) ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
  49. if db == nil {
  50. return fmt.Errorf("database connection is nil")
  51. }
  52. if len(ddlSQLs) == 0 {
  53. return fmt.Errorf("DDL SQL statements are empty")
  54. }
  55. // 开始事务
  56. tx, err := db.Begin()
  57. if err != nil {
  58. return fmt.Errorf("failed to begin transaction: %v", err)
  59. }
  60. // 依次执行所有DDL语句
  61. for i, ddlSQL := range ddlSQLs {
  62. if ddlSQL == "" {
  63. tx.Rollback()
  64. return fmt.Errorf("DDL SQL statement at index %d is empty", i)
  65. }
  66. _, err = tx.Exec(ddlSQL)
  67. if err != nil {
  68. tx.Rollback()
  69. return fmt.Errorf("failed to execute DDL at index %d: %v", i, err)
  70. }
  71. }
  72. // 提交事务
  73. if err := tx.Commit(); err != nil {
  74. return fmt.Errorf("failed to commit transaction: %v", err)
  75. }
  76. return nil
  77. }
  78. // 快捷方法 - 对外暴露的DDL执行方法
  79. // QuickExecuteDDL 快捷执行DDL语句
  80. func QuickExecuteDDL(db *sql.DB, ddlSQL string) error {
  81. factory := &DBFactory{}
  82. return factory.ExecuteDDL(db, ddlSQL)
  83. }
  84. // QuickExecuteDDLWithTx 快捷在事务中执行DDL语句
  85. func QuickExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
  86. factory := &DBFactory{}
  87. return factory.ExecuteDDLWithTx(db, ddlSQL)
  88. }
  89. // QuickExecuteMultipleDDL 快捷执行多个DDL语句
  90. func QuickExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
  91. factory := &DBFactory{}
  92. return factory.ExecuteMultipleDDL(db, ddlSQLs)
  93. }