scan - upserts a granel dentro de una transacción sql en Golang
golang sql get number of rows (2)
He estado jugando con el paquete sql de golang con transacciones, y estoy tratando de entender cómo hacer cambios masivos sin la comunicación de ida y vuelta "por inserción" para cada fila. Los ejemplos que se muestran aquí no muestran realmente cómo se realizarían las consultas masivas.
updateMoney, err := db.Prepare("INSERT INTO balance set money=?, id=? ON DUPLICATE UPDATE balance SET money=money+? WHERE id=?")
...
tx, err := db.Begin()
...
res, err := tx.Stmt(updateMoney).Exec(123.45, 1, 123.45, 1)
res, err := tx.Stmt(updateMoney).Exec(67.89, 2, 67.89, 2)
res, err := tx.Stmt(updateMoney).Exec(10.23, 3, 10.23, 3)
...
tx.Commit()
Idealmente, podría tomar una consulta preparada y crear una lista de actualizaciones que se enviarán al mismo tiempo ... pero aquí, obtenemos un resultado de la base de datos después de cada ejecución. ¿Alguna sugerencia sobre cómo hacer esto?
Edición: mi compañero de trabajo encontró este ticket abierto que describe el problema ... parece ser una preocupación mayor que estrictamente dentro del contexto de una transacción.
Depende del controlador que esté utilizando, algunos controladores / bases de datos no admiten transacciones en absoluto.
Por ejemplo, go-sql-driver/mysql admite transacciones muy bien.
Su código debería funcionar, o podría cambiarlo un poco para:
tx, err := db.Begin()
...
stmt, err := tx.Prepare(`INSERT INTO balance set money=?, id=? ON DUPLICATE UPDATE balance SET money=money+? WHERE id=?`)
res, err := stmt.Exec(123.45, 1, 123.45, 1)
res, err := stmt.Exec(67.89, 2, 67.89, 2)
res, err := stmt.Exec(10.23, 3, 10.23, 3)
...
tx.Commit()
También verifique esta answer que entra en muchos detalles sobre las transacciones.
Entonces, si bien no pudimos hacer consultas separadas para cada aumento de imagen, escribimos mysql válido para actualizaciones de volumen en una sola declaración ...
INSERT INTO balance (id, money) VALUES (1, 123.45), (2, 67.89), (3, 10.23)
ON DUPLICATE KEY UPDATE money = money + values(money)
Por lo tanto, para cualquier persona que quiera hacer un aumento de volumen, hay un patrón para evitar cualquier limitación del controlador mysql.