Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[gunosy.go]database/sql

ysekky
June 25, 2014

 [gunosy.go]database/sql

ysekky

June 25, 2014
Tweet

More Decks by ysekky

Other Decks in Programming

Transcript

  1. 自己紹介 •  関 喜史   •  株式会社Gunosy,  社会人博士在学中   • 

    分析系エンジニア   – ユーザ行動解析/コンテンツ評価/情報推薦   •  普段はPython.最近Julia勉強中   •  Go歴3日  
  2. database •  database/sql   •  database/sql/driver   •  SQLベースのデータベースに対する包括的な インタフェースを提供している

      •  driverはsqlパッケージのインタフェースを各 データベースで使用するために実装するパッ ケージのインタフェースを定義している
  3. func  Open •  sql.Open(driverName,  dataSourceName)  (*DB,  error)   – ex.  sql.Open(“sqlite3”,

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

    •  func  Driver   •  func  Excec   •  func  Ping   •  func  Prepare   •  func  Query   •  func  QueryRow   •  func  Set  MaxIdleConns   •  func  Set  MaxOpenConns  
  5. 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メソッドで取得する
  6. Result,  Rows,  Row •  type  Result   – LastInsertId()  (int64,  error)

      – RowsAffected()  (int64,  error)   •  type  Row   – func(*Row)  Scan(dest…interface  {})  error   •  columnsをdestで指定した変数に渡す.   •  1行以上マッチした場合は最初の1行が指定される   •  マッチしなかった場合はエラーを得る  
  7. 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   •  現在参照している行を読み込む  
  8. •  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するコネクション数の最大値を決める  
  9. 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  
  10. func  Begin •  func  (db  *DB)  Begin  (*Tx,  error)  

    – starts  a  transacgon   •  type  Tx   – in  progress  database  transacgon   •  Beginでtransacgonを得る.InsertやUpdateな どのtransacgonを伴う処理はBeginで得た transacgonに対して行う  
  11. 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   •  トランザクションをロールバックする