Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Add 11.NextResultSet #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions 11.NextResultSet/Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# https://taskfile.dev

version: "3"

vars:
DBFILE: chinook.db

tasks:
default:
cmds:
- cp -f ../{{.DBFILE}} .
- go run main.go
108 changes: 108 additions & 0 deletions 11.NextResultSet/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package main

import (
"database/sql"
"fmt"
"log"
"strings"

"github.com/devlights/sqlmap"
"github.com/k0kubun/pp/v3"

_ "github.com/mattn/go-sqlite3"
)

func init() {
log.SetFlags(0)
}

// 11.NextResultSet
//
// データベースドライバ側の実装が行われている場合は
// 一度に複数の結果セットを取得することができる。
// その場合、*sql.Rows.NextResultSet() を呼び出し
// 次のカーソルに進める。
//
// - https://pkg.go.dev/database/[email protected]#example-DB.Query-MultipleResultSets
//
// 本リポジトリで利用している github.com/mattn/go-sqlite3 は、複数の結果セットに
// 対応していないことが作者さんのブログ記事にて記載されている。
//
// - https://mattn.kaoriya.net/software/lang/go/20161106232834.htm
//
// 以下、作者さんのブログ記事より引用。
//
// > go-sqlite3 もサポートする予定でしたが、sqlite3 の複数クエリ実行は golang の複数結果セットが期待する物と異なる為、現状は実装を見送りました。
//
// そのため、以下は実装のみを記載しておく。
//
// 恐らく、PostgreSQLとMySQLのドライバは対応しているので可能なはず。
// (MySQLは、multiStatements=trueの指定が必要)
func main() {
if err := run(); err != nil {
log.Panic(err)
}
}

func run() error {
var (
db *sql.DB
err error
)

db, err = sql.Open("sqlite3", "./chinook.db")
if err != nil {
return err
}
defer db.Close()

var (
query string
sb strings.Builder
)

sb.WriteString("SELECT ArtistId,Name FROM artists LIMIT 2;")
sb.WriteString("SELECT TrackId,Name FROM tracks LIMIT 2;")
query = sb.String()

var (
rows *sql.Rows
)

rows, err = db.Query(query)
if err != nil {
return err
}
defer rows.Close()

var (
m []map[string]any
)

//
// First Result
//
m, err = sqlmap.MapRows(rows)
if err != nil {
return err
}
pp.Println(m)

//
// 次の結果セットへ
//
if !rows.NextResultSet() {
return fmt.Errorf("rows.NextResultSet() returns false")
}

//
// Second Result
//
m, err = sqlmap.MapRows(rows)
if err != nil {
return err
}
pp.Println(m)

return nil
}
12 changes: 12 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,15 @@ module github.com/devlights/try-golang-database
go 1.22

require github.com/mattn/go-sqlite3 v1.14.22

require (
github.com/devlights/sqlmap v0.1.1
github.com/k0kubun/pp/v3 v3.2.0
)

require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
)
37 changes: 37 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,2 +1,39 @@
github.com/devlights/sqlmap v0.1.1 h1:z4HKpzBgd7VoARtvNu49TudILid2NS2pzhRwmEiZtdU=
github.com/devlights/sqlmap v0.1.1/go.mod h1:R6JOMjK30hRREaqdTdoI1i8isahrPsvbgdicGLhS7cQ=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo=
github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs=
github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE=
modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM=
modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=