How do I batch sql statements with package database/sql

前端 未结 12 2652
深忆病人
深忆病人 2020-12-04 16:46

How do I batch sql statements with Go\'s database/sql package?

In Java I would do it like this :

// Create a prepared statement
String sql = \"INSERT         


        
12条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-04 17:25

    For Postgres lib pq supports bulk inserts: https://godoc.org/github.com/lib/pq#hdr-Bulk_imports

    But same can be achieved through below code but where it is really helpful is when one tries to perform bulk conditional update (change the query accordingly).

    For performing similar bulk inserts for Postgres, you can use the following function.

    // ReplaceSQL replaces the instance occurrence of any string pattern with an increasing $n based sequence
    func ReplaceSQL(old, searchPattern string) string {
       tmpCount := strings.Count(old, searchPattern)
       for m := 1; m <= tmpCount; m++ {
          old = strings.Replace(old, searchPattern, "$"+strconv.Itoa(m), 1)
       }
       return old
    }
    

    So above sample becomes

    sqlStr := "INSERT INTO test(n1, n2, n3) VALUES "
    vals := []interface{}{}
    
    for _, row := range data {
       sqlStr += "(?, ?, ?)," // Put "?" symbol equal to number of columns
       vals = append(vals, row["v1"], row["v2"], row["v3"]) // Put row["v{n}"] blocks equal to number of columns
    }
    
    //trim the last ,
    sqlStr = strings.TrimSuffix(sqlStr, ",")
    
    //Replacing ? with $n for postgres
    sqlStr = ReplaceSQL(sqlStr, "?")
    
    //prepare the statement
    stmt, _ := db.Prepare(sqlStr)
    
    //format all vals at once
    res, _ := stmt.Exec(vals...)
    

提交回复
热议问题