package factory import ( "database/sql" "fmt" ) // ExecuteDDL 执行DDL语句(创建、删除、更新表等) func (f *DBFactory) ExecuteDDL(db *sql.DB, ddlSQL string) error { if db == nil { return fmt.Errorf("database connection is nil") } if ddlSQL == "" { return fmt.Errorf("DDL SQL statement is empty") } // 执行DDL语句 _, err := db.Exec(ddlSQL) if err != nil { return fmt.Errorf("failed to execute DDL: %v", err) } return nil } // ExecuteDDLWithTx 在事务中执行DDL语句 func (f *DBFactory) ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error { if db == nil { return fmt.Errorf("database connection is nil") } if ddlSQL == "" { return fmt.Errorf("DDL SQL statement is empty") } // 开始事务 tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %v", err) } // 执行DDL语句 _, err = tx.Exec(ddlSQL) if err != nil { // 回滚事务 tx.Rollback() return fmt.Errorf("failed to execute DDL in transaction: %v", err) } // 提交事务 if err := tx.Commit(); err != nil { return fmt.Errorf("failed to commit transaction: %v", err) } return nil } // ExecuteMultipleDDL 执行多个DDL语句 func (f *DBFactory) ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error { if db == nil { return fmt.Errorf("database connection is nil") } if len(ddlSQLs) == 0 { return fmt.Errorf("DDL SQL statements are empty") } // 开始事务 tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %v", err) } // 依次执行所有DDL语句 for i, ddlSQL := range ddlSQLs { if ddlSQL == "" { tx.Rollback() return fmt.Errorf("DDL SQL statement at index %d is empty", i) } _, err = tx.Exec(ddlSQL) if err != nil { tx.Rollback() return fmt.Errorf("failed to execute DDL at index %d: %v", i, err) } } // 提交事务 if err := tx.Commit(); err != nil { return fmt.Errorf("failed to commit transaction: %v", err) } return nil } // 快捷方法 - 对外暴露的DDL执行方法 // QuickExecuteDDL 快捷执行DDL语句 func QuickExecuteDDL(db *sql.DB, ddlSQL string) error { factory := &DBFactory{} return factory.ExecuteDDL(db, ddlSQL) } // QuickExecuteDDLWithTx 快捷在事务中执行DDL语句 func QuickExecuteDDLWithTx(db *sql.DB, ddlSQL string) error { factory := &DBFactory{} return factory.ExecuteDDLWithTx(db, ddlSQL) } // QuickExecuteMultipleDDL 快捷执行多个DDL语句 func QuickExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error { factory := &DBFactory{} return factory.ExecuteMultipleDDL(db, ddlSQLs) }