Slide 1

Slide 1 text

database  package Yoshifumi  Seki   Gunosy.go  #3  2014.06.25  

Slide 2

Slide 2 text

自己紹介 •  関 喜史   •  株式会社Gunosy,  社会人博士在学中   •  分析系エンジニア   – ユーザ行動解析/コンテンツ評価/情報推薦   •  普段はPython.最近Julia勉強中   •  Go歴3日  

Slide 3

Slide 3 text

database •  database/sql   •  database/sql/driver   •  SQLベースのデータベースに対する包括的な インタフェースを提供している   •  driverはsqlパッケージのインタフェースを各 データベースで使用するために実装するパッ ケージのインタフェースを定義している

Slide 4

Slide 4 text

今日の発表 •  database/sql/driverはdriver作りたい人向けな のでゆるふわユーザにはあんまり関係ないと して割愛します><   •  Database/sqlの使い方について紹介します

Slide 5

Slide 5 text

実際に動かしてみる •  SQLiteのDriver     •  hKps://github.com/maKn/go-­‐sqlite3/blob/ master/_example/simple/simple.go  

Slide 6

Slide 6 text

func  Open •  sql.Open(driverName,  dataSourceName)  (*DB,  error)   – ex.  sql.Open(“sqlite3”,  “./foo.csv”)   – データベースに接続する   – driverNameはdriverごとに規定されている   – DB型の変数を返す   •  sqliteの場合   – ex:  sql.Open(“sqlite3”,  “../foo.csv”)

Slide 7

Slide 7 text

Openメソッド内でdriverNameをキーとしてdrivers変数にアクセスしている   drivers変数はdatabase/sql内でグローバルに定義されている Registerメソッドによって各ドライバのdriverNameとともに設定される

Slide 8

Slide 8 text

maKn/go-­‐sqlite3/sqlite3.goのinitで上記のように呼び出されている fo-­‐sql-­‐driver/mysql/driver.goのinitで上記のように呼び出されている driverNameは各ライブラリが固有で決める

Slide 9

Slide 9 text

type  DB •  func  Begin   •  func  Close   •  func  Driver   •  func  Excec   •  func  Ping   •  func  Prepare   •  func  Query   •  func  QueryRow   •  func  Set  MaxIdleConns   •  func  Set  MaxOpenConns  

Slide 10

Slide 10 text

Exec,  Query,  QueryRow •  トランザクションを伴わない処理(SELECTなど)を実行する   •  プレースホルダは使えるが,driverのライブラリによって仕 様がことなることがある   •  func(*DB)  Exec(query  string,  args…  interface{})  (Result,   error)   –  返り値を伴わない命令を実行する   –  Create  Tableなど   •  func(*DB)  Query(query  string,  args…,  interface{})(*Rows,   error)   –  複数行を得る.通常のSELECT文などで用いる   •  func(*DB)  QueryRow(query  string,  args…,  interface{})  *Row   –  最大で1つしか結果を得ないSELECT文などで用いる   –  エラーはRowにあるScanメソッドで取得する

Slide 11

Slide 11 text

Result,  Rows,  Row •  type  Result   – LastInsertId()  (int64,  error)   – RowsAffected()  (int64,  error)   •  type  Row   – func(*Row)  Scan(dest…interface  {})  error   •  columnsをdestで指定した変数に渡す.   •  1行以上マッチした場合は最初の1行が指定される   •  マッチしなかった場合はエラーを得る  

Slide 12

Slide 12 text

Result,  Rows,  Row •  type  Rows   –  func(*Rows)  Close()  error   •  Rowsを閉じてこれ以上イテレートできなくする   •  Next()でFalseが呼ばれると自動でCloseされる   –  func(*Rows)  Columns()  ([]string,  error)   •  カラム名のリストを返す   –  func(*Rows)  Err()  error   •  イテレーション中に発生したエラーを返す   –  func(*Rows)  Next()  bool   •  Scanメソッドで読み込む行の参照を1つ進める   –  func(*Rows)  Scan(dest…  interface{})  error   •  現在参照している行を読み込む  

Slide 13

Slide 13 text

Example:  Query

Slide 14

Slide 14 text

Example:  QueryRow

Slide 15

Slide 15 text

•  func  (*DB)  Close()  error   – DBを閉じる   •  func  (*DB)  Driver()  driver.Driver   – driverを返す   •  func  (*DB)  Ping()  error   – connecgonが有効かを確認する   •  func(*DB)  SetMaxIdleConns(n  int)   – idle  connecgon  poolの最大値を決める   •  func(*  DB)  SetMaxOpenConns(n  int)   – dbがopenするコネクション数の最大値を決める  

Slide 16

Slide 16 text

Prepare •  func(*DB)  Parepare(query  string)  (*  Stmt,   error)   – Prepared  statementを作る.  

Slide 17

Slide 17 text

type  Stmt •  Prepared  Statement   •  typeStmt   – func(s  *Stmt)  Close  error   – func(s  *Stmt)  Exec(args  …interface{})  (Result,   error)   – func(s  *Stmt)  Query(args  …interface{})  (*Rows,   error)   – func(s  *Stmt)  QueryRow(args  …interface{})  *Row  

Slide 18

Slide 18 text

func  Begin •  func  (db  *DB)  Begin  (*Tx,  error)   – starts  a  transacgon   •  type  Tx   – in  progress  database  transacgon   •  Beginでtransacgonを得る.InsertやUpdateな どのtransacgonを伴う処理はBeginで得た transacgonに対して行う  

Slide 19

Slide 19 text

type  Tx •  In-­‐progress  database  transacgon   •  CommitかRollbackで終了する   •  Commit,  Rollbackの後に操作すると ErrTxDoneが変える   •  type  Tx   –  func(tx  *Tx)  Commit()  error   •  トランザクションをコミットする   –  Func(tx  *Tx)  Exec(args  …interface{})  (Result,  error)   –  Func(tx  Tx)  Prepare(query  string)  (*Stmt,  error)   •  Tx内でしか使えない   –  Func(tx  *Tx)  Query(query,  args  …interface{})  (*Rows,  error)   –  Func(tx  *Tx)  QueryRow(args  …interface{})  *Row   –  Func(tx  *Tx)  Rollback()  error   •  トランザクションをロールバックする  

Slide 20

Slide 20 text

Func(*Tx)  Stmt(stmt  *Stmt)  *Stmt •  Stmt  returns  a  transacgon-­‐specific  prepared   statement  from  an  exisgng  stategme