## Problem

At some point we have a function that receive an instance of database 
connection to query rows in specific table.

Let's say that function F() accept DB that query table T.

If function F() called with DB instance, it will query only rows that has been 
committed into database.

IF function F() called with Tx instance, it will query all rows including the 
one that has not been committed yet into database.

Since DB and Tx are different types, we will have two functions that almost 
have identical code,

func F(db *sql.DB) (output int) {
  q := `SELECT … FROM T WHERE …`
  err := db.QueryRow(q).Scan(&output)
  …
  return output
}

func FWithTx(tx *sql.Tx)(output int) {
  q := `SELECT … FROM T WHERE …`
  err := tx.QueryRow(q).Scan(&output)
  …
  return output
}


## Proposed solution

Add an interface Session (the name is not fixed yet) to package sql with the 
following signature,

type Session interface {
    func Exec(query string, args ...interface{}) (Result, error)
    func ExecContext(ctx context.Context, query string, args ...interface{}) 
(Result, error)
    func Prepare(query string) (*Stmt, error)
    func PrepareContext(ctx context.Context, query string) (*Stmt, error)
    func Query(query string, args ...interface{}) (*Rows, error)
    func QueryContext(ctx context.Context, query string, args ...interface{}) 
(*Rows, error)
    func QueryRow(query string, args ...interface{}) *Row
    func QueryRowContext(ctx context.Context, query string, args 
...interface{}) *Row
}

Session interface is combination of DB and Tx that contains all identical 
methods.


## Rationale

Without Session, user will have two functions that have the same code,

By using Session, we can minimise duplicate code in the user level. for example 
using the previous problems definition the function F() become one,

func F(session sql.Session)(output int) {
  q := `SELECT … FROM T WHERE …`
  err := session.QueryRow().Scan(&output)
  …
  return output
}


## Discussion

Any thought about this proposal?

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/C8AB29FF-7A85-445A-B09E-A0E7CB322A4C%40gmail.com.

Reply via email to