Slide 1

Slide 1 text

いまさら database/sql いまさら database/sql 2018-12-18 rock619

Slide 2

Slide 2 text

DB 接続 DB 接続 import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.Open("mysql", "user:password@protocol(host: if err != nil { panic(err) } defer db.Close() }

Slide 3

Slide 3 text

database driver の import database driver の import database/sql/driver パッケージ database driver のinterface が定義されている 使用するdriver のimport driver のinterface の実装 github.com/go-sql-driver/mysql/

Slide 4

Slide 4 text

sql.DB sql.DB コネクションのプールを管理してくれる 複数のゴルーチンから使っても安全

Slide 5

Slide 5 text

sql.Open() sql.Open() 1 回だけでいい いちいちClose() する必要はない コネクションが作られるわけではない 接続できるかはPing() で確かめる必要あり

Slide 6

Slide 6 text

Ping() Ping() err = db.Ping() if err != nil { // do something here }

Slide 7

Slide 7 text

database/sql/driver database/sql/driver Queryer...? type Queryer interface { Query(query string, args []Value) (Rows, error) } https://www.google.com/search?q=queryer

Slide 8

Slide 8 text

QueryRow() QueryRow() var name string err = db.QueryRow("select name from users where id = ?", 1).Sc if err != nil { return err } fmt.Println(name)

Slide 9

Slide 9 text

QueryRow() QueryRow() var name string err = db.QueryRow("select name from users where id = ?", 1).Sc switch err { case sql.ErrNoRows: return "" case nil: return name default: return err }

Slide 10

Slide 10 text

Null Null type NullString struct { String string Valid bool // Valid is true if String is not NULL }

Slide 11

Slide 11 text

Scanner Scanner // Scan implements the Scanner interface. func (ns *NullString) Scan(value interface{}) error { if value == nil { ns.String, ns.Valid = "", false return nil } ns.Valid = true return convertAssign(&ns.String, value) }

Slide 12

Slide 12 text

Valuer Valuer // Value implements the driver Valuer interface. func (ns NullString) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return ns.String, nil }

Slide 13

Slide 13 text

sql.DBStats sql.DBStats MaxOpenConnections SetMaxOpenConns() で設定できる デフォルト: 0 (0 以下だと無制限)

Slide 14

Slide 14 text

sql.DBStats sql.DBStats 1.11 で追加されたもの OpenConnections コネクション数 InUse 使用中のコネクション数 Idle OpenConnections - InUse

Slide 15

Slide 15 text

sql.DBStats sql.DBStats WaitCount コネクション待ちが発生した回数 WaitDuration 待った総時間 MaxIdleClosed MaxIdleConns を超えたためclose されたコネク ション数 MaxLifetimeClosed MaxLifetime を超えたためclose されたコネクシ ョン数

Slide 16

Slide 16 text

参考 参考 https://golang.org/pkg/database/sql/ https://golang.org/pkg/database/sql/driver/ https://github.com/golang/go/wiki/SQLInterface