Skip to content

Latest commit

 

History

History
137 lines (98 loc) · 5.64 KB

File metadata and controls

137 lines (98 loc) · 5.64 KB

5.2 MySQL データベースの使用

現在Internet上で流行しているホームページフレームワークの方法はLAMPです。この中のMがMySQLです。データベースとして、MySQLは無料、オープンソース、使用方法において多くのWeb開発のバックエンドのデータベースストレージエンジンとして優位に立ってきました。

MySQLドライバ

GoではMySQLをサポートしたドライバが現在比較的多く、以下のようにいくつかが存在します。あるものはdatabase/sql標準をサポートしており、またあるものは独自でインターフェースの実装を採用しているものもあります。よく使われるものは以下のいくつかです:

以降の例では私ははじめのドライバを使ってまいります。(現在の項目でもこのドライバを使います)、またこのドライバの利用をみなさんにお勧めします。理由は:

  • このドライバは比較的新しく、メンテナンスも良いほうです。
  • 完全にdatabase/sqlインターフェースをサポートします。
  • keepaliveをサポートしています。継続した接続を保持しています。星星がforkしたmymysqlもkeepaliveをサポートしているとはいえ、スレッドセーフではありません。これは低いレイヤーからkeepaliveをサポートしています。

コード例

続くいくつかの節では同じデータベーススキーマを採用します:データベースtest、ユーザ名userinfo、関連ユーザ情報テーブルuserdetail。

CREATE TABLE `userinfo` (
	`uid` INT(10) NOT NULL AUTO_INCREMENT,
	`username` VARCHAR(64) NULL DEFAULT NULL,
	`departname` VARCHAR(64) NULL DEFAULT NULL,
	`created` DATE NULL DEFAULT NULL,
	PRIMARY KEY (`uid`)
)

CREATE TABLE `userdetail` (
	`uid` INT(10) NOT NULL DEFAULT '0',
	`intro` TEXT NULL,
	`profile` TEXT NULL,
	PRIMARY KEY (`uid`)
)

以下の例ではどのようにしてdatabase/sqlインターフェースを使ってデータベースのテーブルに対し、追加・削除・修正・検索操作を行うか示しています。

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"database/sql"
	"fmt"
	//"time"
)

func main() {
	db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8")
	checkErr(err)

	//データの挿入
	stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
	checkErr(err)

	res, err := stmt.Exec("astaxie", "研究開発部門", "2012-12-09")
	checkErr(err)

	id, err := res.LastInsertId()
	checkErr(err)

	fmt.Println(id)
	//データの更新
	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
	checkErr(err)

	res, err = stmt.Exec("astaxieupdate", id)
	checkErr(err)

	affect, err := res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)

	//データの検索
	rows, err := db.Query("SELECT * FROM userinfo")
	checkErr(err)

	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)
		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}

	//データの削除
	stmt, err = db.Prepare("delete from userinfo where uid=?")
	checkErr(err)

	res, err = stmt.Exec(id)
	checkErr(err)

	affect, err = res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)

	db.Close()

}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

上のコードで、GoがMysqlデータベースを操作するのが非常に簡単だとお分かりいただけたかと思います。

キーとなるいくつかの関数についてご説明します:

sql.Open()関数は登録済みのデータベースドライバを開くために使用されます。go-sql-driverの中でmysqlのデータベースドライバを登録し、2つ目の引数はDSN(Data Source Name)です。これはgo-sql-driverが定義するデータベース接続と設定情報です。以下のシンタックスをサポートします:

user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

db.Prepare()関数はsql操作を実行するプリペアードステートメントを返すために用いられます。その後、準備完了の実行状態を返します。

db.Query()関数は直接Sqlを実行しRows結果を返すために使われます。

stmt.Exec()関数はstmtが用意されたSQL文を実行するために用いられます。

渡される引数がどれも=?に対応するデータであることがわかるかとおもいます。このような方法である程度SQLインジェクションを防止することができます。

links