kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

Golangでデータベース接続する

本章では、GO言語でデータベース接続する方法について共有します。

前提

今回は、MySQLで接続する方法についてお伝えします。開発環境では localhostに接続する方法を、本番環境ではGoogleのCloudSQLに接続する方法について説明します。

準備

GolangMySQLを利用する際には、以下のライブラリを利用します。

またSQLの標準インタフェースを拡張した、ライブラリも導入します。
github.com

まず、GOPATHにプロジェクトフォルダを指定し、以下のコマンドを実行します。

$ go get -u github.com/go-sql-driver/mysql
$ go get github.com/jmoiron/sqlx

プロジェクトに、ライブラリがインストールされます。

プログラム

次に、MySQLインスタンスを利用するための接続処理を準備します。

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"log"
	"sync"
)

// 各所で使い回すMySQLのインスタンスのポインタを定義
var instanceMySql *sqlx.DB
// MySQLの初期化で利用する、排他ロックオブジェクト
var onceMySql sync.Once

func Db() *sqlx.DB {
	// 排他ロック制御
	onceMySql.Do(func() {
		initializeMySql()
	})
	return instanceMySql
}

func initializeMySql() {
	var err error
	// MySQLに接続する
	instanceMySql, err = sqlx.Connect(
		"mysql",
		"【MySQLへの接続文字列】",
	)
	if err != nil {
		fmt.Println("Failed to run mysql: ", err)
		log.Fatalln("Failed to run mysql: ", err)
	}
}

MySQLへの接続文字列は、localhost と cloud SQL それぞれ以下の通りです。

【ユーザー名】:【パスワード】@tcp(127.0.0.1:3306)/【DB名】

【ユーザー名】:【パスワード】@unix(/cloudsql/【cloud SQLで発行されるインスタンス接続名】)/【DB名】

上記のプログラムを利用し、SQL文を発行します。

	user := struct {
		Id int `db:"Id"`
		Name string `db:"Name"`
	}
	var users []user

	s := `
SELECT
  Id,
  Name
FROM
  User
WHERE
  Name LIKE ?;
`
	
	if err := Db().Select(&users, s, "hoge%"); err != nil {
		return err
	}

これで、SQLが発行されデータを取得できます。Update、InsertやDeleteも、同様に操作できます。また取得できるデータが単数と予めわかっている場合、「Select」ではなく「Get」で直接構造体にバインドできます。

筆休め

データを管理する手法として、KVSのケースも増えてきてはいますが、トランザクション処理が求められるケースの場合RDBが採用されることが多いため、利用するための方法を知っておいて損はないかもしれません。

以上、「 Golangでデータベース接続する」でした


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.