mysql icon indicating copy to clipboard operation
mysql copied to clipboard

Add support for accessing LastInsertId and RowsAffected for all statements in a batch

Open mherr-google opened this issue 3 years ago • 3 comments

Issue description

When calling Exec() with multiple statements, we'd like to be able to access LastInsertId and RowsAffected for all statements, not just the last one.

The motivating use case is performing batches of UPDATE statements with minimal roundtrips, while determining the result of each separately.

Example code

My PR to implement this exposes additional methods on mysqlResult, which is accessible when querying with sql.Conn.Raw() using a new mysql.Result interface:

      conn, _ := db.Conn(ctx)
      conn.Raw(func(conn interface{}) error {
        ex := conn.(driver.Execer)
        res, _ := ex.Exec(`
        UPDATE point SET x = 1 WHERE y = 2;
        UPDATE point SET x = 2 WHERE y = 3;
        `, nil)
        log.Print(res.(mysql.Result).AllRowsAffected()) // eg. {5, 10}
     })

It looks like exposing the same functionality for sql.Stmt isn't possible yet, since it has no equivalent to sql.Conn.Raw().

mherr-google avatar Aug 31 '21 23:08 mherr-google

I have a PR for this, will mail shortly.

mherr-google avatar Aug 31 '21 23:08 mherr-google

I am also having the same issue with v1.6.0. Both RowsAffected() and LastInsertId() return 0 even if the update statement succeeds. Is there any workaround for this?

jaysonhurd avatar Nov 09 '21 23:11 jaysonhurd

I am also having the same issue with v1.6.0. Both RowsAffected() and LastInsertId() return 0 even if the update statement succeeds. Is there any workaround for this?

I just observed this issue now in RowsAffected() v1.6.0 also. In my own case, it occurred on a PreparedStatement, and the statements were not batched

gbenroscience avatar Jul 18 '22 16:07 gbenroscience

Fixed by #1309

methane avatar Jun 17 '23 17:06 methane