duanji7881 2015-01-02 11:09
浏览 355
已采纳

在一个事务中用golang进行多个查询的惯用方式

I'm currently struggling (my 2nd day) to find the best way to do multiple queries and was wondering if you know a solution.

I have an open *sql.DB Connection, named myDb and use the go-sql-driver

func TruncateGalleryImport() error {

    s := make([]string, 0)

    s = append(s, "TRUNCATE TABLE add_map")
    s = append(s, "TRUNCATE TABLE album")
    s = append(s, "TRUNCATE TABLE album_permission")
    s = append(s, "TRUNCATE TABLE album_view")
    s = append(s, "TRUNCATE TABLE album_watch")
    s = append(s, "TRUNCATE TABLE media")
    s = append(s, "TRUNCATE TABLE media_user_view")
    s = append(s, "TRUNCATE TABLE media_view")
    s = append(s, "TRUNCATE TABLE media_watch")
    s = append(s, "TRUNCATE TABLE private_map")
    s = append(s, "TRUNCATE TABLE attachment")
    s = append(s, "TRUNCATE TABLE attachment_data")

    for _, q := range s {
        _, err := myDb.Exec(q)
        if err != nil {
            return err
        }
    }

    return nil
}

Is it possible to commit all the above queries together using only one transaction?

Cheers

  • 写回答

2条回答 默认 最新

  • douqi2804 2015-01-02 11:39
    关注

    Use a Transaction, like this (see the comments in the code):

    func TruncateGalleryImport() error {
        s := make([]string, 0)
    
        s = append(s, "TRUNCATE TABLE add_map")
        s = append(s, "TRUNCATE TABLE album")
        s = append(s, "TRUNCATE TABLE album_permission")
        s = append(s, "TRUNCATE TABLE album_view")
        s = append(s, "TRUNCATE TABLE album_watch")
        s = append(s, "TRUNCATE TABLE media")
        s = append(s, "TRUNCATE TABLE media_user_view")
        s = append(s, "TRUNCATE TABLE media_view")
        s = append(s, "TRUNCATE TABLE media_watch")
        s = append(s, "TRUNCATE TABLE private_map")
        s = append(s, "TRUNCATE TABLE attachment")
        s = append(s, "TRUNCATE TABLE attachment_data")
    
        // Get new Transaction. See http://golang.org/pkg/database/sql/#DB.Begin
        txn, err := myDb.Begin()
    
        if err != nil {
            return err
        }
    
        defer func() {
            // Rollback the transaction after the function returns.
            // If the transaction was already commited, this will do nothing.
            _ = txn.Rollback()
        }()
    
        for _, q := range s {
            // Execute the query in the transaction.
            _, err := txn.Exec(q)
    
            if err != nil {
                return err
            }
        }
    
        // Commit the transaction.
        return txn.Commit()
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看