go言語の学習メモ6(データベースアクセス)
最近は
なんかまた疲れている…
仕事と勉強でやっていることが違うのでうまく頭で処理しきれていないので混乱しているだけかもしれないけど
ドライバインストール
go get "github.com/go-sql-driver/mysql"
データベース準備
作成
create database sample_db4;
テーブル作成
CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) DEFAULT NULL, `body` varchar(256) DEFAULT NULL, `date` date DEFAULT NULL, `age` int(11) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
サンプル
sample_db1.go(抽出)
package main import ( "fmt" // "os" ) import "database/sql" import _ "github.com/go-sql-driver/mysql" func main() { fmt.Println("start") // 接続 db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/sample_db4") if err != nil { panic(err.Error()) } // 最後に切断 defer db.Close() // 1件取得 id := 2 var title string err = db.QueryRow("SELECT body FROM posts WHERE id = ? LIMIT 1", id).Scan(&title); if err != nil { panic(err.Error()) } fmt.Println(id, title) // 全件取得 rows, err := db.Query("SELECT id, body FROM posts ORDER BY id") if err != nil { panic(err.Error()) } defer rows.Close() // 遅延クローズ for rows.Next() { var id int var body string err = rows.Scan(&id, &body) if err != nil { panic(err.Error()) } fmt.Println(id, body) } fmt.Println("end") }
↓
$ go run sample_db1.go start 2 bbbbb 1 aaaaaa 2 bbbbb 3 cccccc 4 dddddd end $
※簡単な抽出なのでプリペアードステートメントではないかも…
sample_db2.go(追加)
package main import ( "fmt" // "os" ) import "database/sql" import _ "github.com/go-sql-driver/mysql" func main() { fmt.Println("start") // 接続 db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/sample_db4") if err != nil { panic(err.Error()) } // 最後に切断 defer db.Close() // 1件更新 result, err := db.Exec("INSERT INTO posts(id, title, body) VALUES(?, ?, ?)", 101, "zzzz01", "zzzzzzzz") if err != nil { panic(err.Error()) } // 更新件数 fmt.Println(result.RowsAffected()) // 全件取得 rows, err := db.Query("SELECT id, body FROM posts ORDER BY id") if err != nil { panic(err.Error()) } defer rows.Close() // 遅延クローズ for rows.Next() { var id int var body string err = rows.Scan(&id, &body) if err != nil { panic(err.Error()) } fmt.Println(id, body) } fmt.Println("end") }
↓
$ go run sample_db2.go start 1 <nil> 1 aaaaaa 2 bbbbb 3 cccccc 4 dddddd 101 zzzzzzzz end $
※簡単な抽出なのでプリペアードステートメントではないかも…
所感
基本的な処理なのでセキュリティ上によあまりよくない記法になっていたが今回はこんな感じでよい実際に実装する際にはもう少しこだわった記載を意識するためにもどうやって行うかを理解しておかないといけないと思うので…
ちょっとサイトの「packages」をみたらかなりの数のパッケージがあったので驚いた。全部を覚えるのは無理なので必要なことだけにしないといけないようです