Open
Description
Hi,
I'm proposing a interface that implements all functions in sql.DB
and sql.Tx
that takes a query string
as one of its arguments. This could be useful when implementing "dumb" functions that retrieves information but in itself dose not need to be prepared however might be used to verify whether to commit or rollback.
The interface I'm proposing is: (The name can of course be changed)
type QueryAble interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Prepare(query string) (*sql.Stmt, error)
Query(query string, args ...interface{}) (*sql.Rows, error)
QueryRow(query string, args ...interface{}) *sql.Row
}
This is an example function Get
that can be used with or without transactions.
func Get (q Queryable)(int){
var test int
res , _ := q.Query("SELECT COUNT(*) FROM table;")
res.Next()
res.Scan(&test)
res.Close()
return test
}
func GetExample(db *sql.DB){
//When you just want to retrieve the information, no need for a transaction
fmt.Printf("Current len of Table %d\n", Get(db))
//Make a change
tx, _ :=db.Begin()
// Add data to table
if Get(tx) > 2 {
fmt.Printf("Table to large: %d robacking to: %d \n", Get(tx) , Get(db))
tx.Rollback()
} else {
fmt.Printf("Table update new len %d\n", Get(tx))
tx.Commit()
}
}