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 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题