m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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
$

※簡単な抽出なのでプリペアードステートメントではないかも…

参考


[Go言語] database/sqlパッケージを使ってみた - Qiita

Examples · go-sql-driver/mysql Wiki · GitHub

所感

基本的な処理なのでセキュリティ上によあまりよくない記法になっていたが今回はこんな感じでよい実際に実装する際にはもう少しこだわった記載を意識するためにもどうやって行うかを理解しておかないといけないと思うので…
ちょっとサイトの「packages」をみたらかなりの数のパッケージがあったので驚いた。全部を覚えるのは無理なので必要なことだけにしないといけないようです