Go 言語から MariaDB Server を使ってみる

Go (Go言語 / Golang, https://golang.org/) は C言語を開発したことで知られる Ken Thompson らによって2009 年に設計された比較的新しいプログラミング言語で,最近人気が高まっています。
今回は Go から MariaDB Server 10.3 に接続してみます。

実行環境

以下の実行環境を用いました。

  • CentOS 7.6.1810
  • MariaDB Server 10.3.15
  • Golang 1.11.5

Golang / MySQL ドライバのインストール

以下のコマンドで golang をインストールします。

sudo yum -y install epel-release
sudo yum -y install golang

執筆時点では以下の RPM がインストールされました。

golang-1.11.5-1.el7.x86_64
golang-bin-1.11.5-1.el7.x86_64
golang-src-1.11.5-1.el7.noarch

Go では外部ライブラリを go get でインストールします。現時点で MariaDB から Go 用 Connector は提供されていませんので,今回はGitHub で公開されている MySQL 用ドライバを用います。

go get github.com/go-sql-driver/mysql

go env で表示される GOPATH で示されるパスにドライバがダウンロード/インストールされます。

$ go env | grep GOPATH 
GOPATH="/home/vagrant/go"

サンプルコード1

MariaDB Server へ接続し,バージョンを確認するサンプルコード(check_mariadb_ver.go)は以下のようになります。なお,事前に test_db データベースと db_user ユーザを作成しています。

// check_mariadb_ver.go
package main

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

func main() {
    // Create the database handle, confirm driver is present
    db, _ := sql.Open("mysql", "db_user:password@/test_db")
    defer db.Close()

    // Connect and check the server version
    var version string
    db.QueryRow("SELECT VERSION()").Scan(&version)
    fmt.Println("Connected to: ", version)
}

サンプルコード1実行結果

サンプルコードをコンパイル/実行します。

$ go build check_mariadb_ver.go
$ ls -l check_mariadb_ver*
-rwxrwxr-x 1 vagrant vagrant 5090940 May 24 10:46 check_mariadb_ver
-rw-rw-r-- 1 vagrant vagrant     453 May 24 10:35 check_mariadb_ver.go
$ ./check_mariadb_ver
Connected to:  10.3.15-MariaDB

また,Go ではスクリプト言語のように go run でプログラムを実行することができます。

$ go run check_mariadb_ver.go
Connected to:  10.3.15-MariaDB

サンプルコード2

https://github.com/datacharmer/test_db にある MySQL 用サンプルデータを MariaDB Server にインポートし,SELECT文を Go で書かれたプログラムから実行してみます。

// test_select.go
package main

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

func main() {
    // Create the database handle, confirm driver is present
    db, _ := sql.Open("mysql", "db_user:password@/employees")
    defer db.Close()

    // Execute the query
    results, err := db.Query("SELECT emp_no, first_name, last_name from employees limit 10")
    if err != nil {
        panic(err.Error()) // proper error handling instead of panic in your app
    }

    for results.Next() {
        var emp_no int
        var first_name string
        var last_name string

        err = results.Scan(&emp_no, &first_name, &last_name)
        if err != nil {
            panic(err.Error()) // proper error handling instead of panic in your app
        }
        fmt.Println("ID: ", emp_no, " Name: ", first_name, last_name)
    }
}

サンプルコード2実行結果

正常にテストデータが取得できているようです。

$ go run test_select.go
ID:  10001  Name:  Georgi Facello
ID:  10002  Name:  Bezalel Simmel
ID:  10003  Name:  Parto Bamford
ID:  10004  Name:  Chirstian Koblick
ID:  10005  Name:  Kyoichi Maliniak
ID:  10006  Name:  Anneke Preusig
ID:  10007  Name:  Tzvetan Zielinski
ID:  10008  Name:  Saniya Kalloufi
ID:  10009  Name:  Sumant Peac
ID:  10010  Name:  Duangkaew Piveteau

まとめ

今回は Go で書かれたプログラムから MariaDB Server に接続し,SELECT 文を実行するサンプルコードについて解説させていただきました。