MysqlのGo言語駆動--Go-MySQL-Driverの使用

7319 ワード

一、特性軽量級と高速原生Go言語、Cバインディングがなく、純粋なGoだけが不安全な操作(タイプ変換など)がなく、動的処理がクラッシュした接続動的接続プールは16 MB以上のクエリー完全sqlをサポートする.RawBytesサポート2、インストール簡単にgo toolを使用してshellでインストールパッケージをあなたの$GOPATH 1$gogetgithubに追加します.com/go-sql-driver/mysqlは、ソースコードをダウンロードしてプロジェクトに置くこともできます.ダウンロードアドレスは次のgithubアドレスです.https://github.com/go-sql-driver/mysql公式サイトhttp://godoc.org/github.com/go-sql-driver/mysql三、sqlパッケージの使用方法は簡潔明瞭である:1、接続を確立して接続を確立するには以下のいくつかの方法がある:user@unix(/path/to/socket)/dbname?charset=utf8user:password@tcp(localhost:5555)/dbname?charset=utf8user:password@/dbnameuser:password@tcp([de:ad:be:ef::ca:fe]:80)/dbnameの2番目の方法が最も一般的な方法です.例えば、db,err:=sql.Open("mysql", "user:password@tcp(localhost:5555)/dbname?charset=utf 8")dbは*sql.DBタイプのポインタで、後の操作ではdbが使用されます.errはエラーメッセージで、空(nil)の説明で接続に成功した場合、charsetは文字セットを設定します.2、基本用法挿入操作db、err:=db.Prepare(`INSERT user(name,age,sex)values(?,?)`)checkErr(err)res, err := db.Exec("tony", 20, 1)checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)ここでは構造化操作を用い,sql文を直接接合する方法は推奨されない.クエリー操作rows,err:=db.Query("SELECT * FROM user") checkErr(err)   for rows.Next(){var id int var name string var age int var sex int rows.Columns()err=rows.Scan(&id,&name,&age,&sex)checkErr(err)fmt.Println(id)fmt.Println(name)fmt.Println(age)fmt.Println(age)fmt.Println(sex)}ここでクエリする方法は、4つの独立変数id、name、age、age、sexは、クエリから得られた各ローの値を保存します.実際の開発では、通常、データベースの操作がカプセル化されます.このようなクエリーでは、辞書のタイプを返すことが考えられます.//scanArgs、valuesの2つの配列を構築します.scanArgsの各値はvaluesの対応する値のアドレスcolumnsを指します._:=rows.Columns() scanArgs := make([]interface{}, len(columns)) values := make([]interface{}, len(columns)) for i := range values {     scanArgs[i] = &values[i] }   for rows.Next(){//行データをrecord辞書err=rows.Scan(scanArgs...)に保存    record := make(map[string]string)     for i, col := range values {         if col != nil {             record[columns[i]] = string(col.([]byte))         }     }     fmt.Println(record)}修正操作stmt,err:=db.Prepare(`UPDATE user SET age=?,sex=? WHERE id=?`) checkErr(err) res, err := stmt.Exec(21, 2, 1) checkErr(err) num, err := res.RowsAffected() checkErr(err) fmt.Println(num)削除操作stmt,err:=db.Prepare(`DELETE FROM user WHERE id=?`) checkErr(err) res, err := stmt.Exec(1) checkErr(err) num, err := res.RowsAffected() checkErr(err) fmt.Println(num)の完全なコード修正と削除は、挿入データと同様に簡単ですが、RowsAffectedを使用して影響するデータ行数を取得します.package main import("database/sql""fmt""github.com/go-sql-driver/mysql")func main(){insert()}//挿入demo funcinsert(){db,err:=sql.Open("mysql","root:@/test?charset=utf 8")checkErr(err)stmt,err:=db.Prepare(`INRT SEuser(name,age,sex)valckErr(err)stmt,err:=db.Prepare(`INRT SEuser(name,age,sex)ues(?,?,?)`)    checkErr(err)     res, err := stmt.Exec("tony", 20, 1)     checkErr(err)     id, err := res.LastInsertId()     checkErr(err)     fmt.Println(id)}//demo func query(){db,err:=sql.Open("mysql","root:@/test?charset=utf 8")checkErr(err)rows,err:=db.Query("SELECT*FROMuser")checkErr(err)//辞書タイプ//scanArgs、valuesの2つの配列を構築します.scanArgsの各値はvaluesの対応する値のアドレスcolumnsを指します._:=rows.Columns()     scanArgs := make([]interface{}, len(columns))     values := make([]interface{}, len(columns))     for i := range values {         scanArgs[i] = &values[i]     }       for rows.Next(){//行データをrecord辞書err=rows.Scan(scanArgs...)に保存        record := make(map[string]string)         for i, col := range values {             if col != nil {                 record[columns[i]] = string(col.([]byte))             }         }         fmt.Println(record)}//更新データfuncupdate(){db,err:=sql.Open("mysql","root:@/test?charset=utf 8")checkErr(err)stmt,err:=db.Prepare(`UPDATE user SET age=?,sex=?WHERE id=?`)checkErr(err)res,err:=stmt.Exec(21,2,1)checkErr(err)num,err:======stmt.Exec(21,2,1)checkErr res.Rowsaffected()checkErr(err)     fmt.Println(num)}//データfuncremove(){db,err:=sql.Open("mysql","root:@/test?charset=utf 8")checkErr(err)stmt,err:=db.Prepare(`DELETE FROMuser WHERE id=?`)checkErr(err)res,err:=stmt.Exec(1)checkErr(err)num,err:=res.RowsAffected()checkErr(checkErr)res,err:=res.RowsAffected()checkErckErr(checkErr(checkErr)r(err)fmt.Println(num)} func checkErr(err error) {     if err != nil {         panic(err)     } }
不適切な点があれば、指摘を歓迎します.