2020年2月29日土曜日

[Go] squirrelのRunWithに*sql.Connを渡したい

QueryBuilderとしてsquirrelを使ってみたけど、*sql.ConnをRunWithに渡せなかった。
普通にToSql()して、conn.QueryContextに渡してやれば良いんだけど、どうしても渡したい。そんな気分。


渡せない理由が、下記エラー。
*sql.Conn does not implement squirrel.BaseRunner (missing Exec method)
私は、SelectBuilderのQueryContextを使いたいだけで、QueryもExecも使わないのだけれど。

なので、おかしなものを定義してみる。
type connWrapper struct {
 *sql.Conn
}

func (c *connWrapper) Exec(query string, args ...interface{}) (sql.Result, error) {
 return nil, nil
}

func (c *connWrapper) Query(query string, args ...interface{}) (*sql.Rows, error) {
 return nil, nil
}

で、前に書いたsql_calc_found_rowsのコードはこんな感じになると。
rows, err := sq.
  Select("*").
  Options("sql_calc_found_rows").
  From("users").
  RunWith(&connWrapper{conn}).QueryContext(ctx)

動いたけど、これじゃない感はあるな…