This may be helpful. https://godoc.org/github.com/golang-sql/sqlexp#Querier
On Thu, Jan 16, 2020 at 1:09 AM Tamás Gulácsi <tgulacs...@gmail.com> wrote: > 2020. január 16., csütörtök 8:20:17 UTC+1 időpontban Shulhan a következőt > írta: >> >> ## 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? > > > > Just define the interface and use it - Go is not Java, iff a type > statisfies an interface, then it also implements it! > > You can use anonymous interfaces also! > > ``` > func F(db interface { QueryRow() *sql.Row })(output int) { > q := `SELECT … FROM T WHERE …` > err := db.QueryRow().Scan(& >> >> output) >> … >> return output >> } > > ``` > > -- > 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/a81bb8a1-bc68-487d-b678-dc3fd344e9ed%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/a81bb8a1-bc68-487d-b678-dc3fd344e9ed%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- - a. -- 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/CAOPexdjHHkB_cT9aJNOPv2_GD2P2jy6LbHe-U%3DNZWkbNbht7uw%40mail.gmail.com.