• トップ
  • ブログ一覧
  • 【第12回】Go言語(Golang)入門~MySQL接続編~
  • 【第12回】Go言語(Golang)入門~MySQL接続編~

    笹川(エンジニア)笹川(エンジニア)
    2019.11.27

    IT技術

    第12回~Go言語(Golang)入門~

    笹川笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    今回は、データベース系の第3弾!

    Firestore、ObjectBox とやってきたので、データベースとしては、王道の1つであるMySQLを使ってみようと思います。

    ただ、MySQL のインストールや構築は省略させていただきます。

    それでは、いってみましょう!

    前回の記事はこちら

    featureImg2019.11.20【第11回】Go言語(Golang)入門~FCM送信編~第11回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、Firebase C...

    MySQLと接続してみよう

    今回は、「GORM」というライブラリを使います。

    【GORM(ゴルム)】
    https://gorm.io/

    いわゆる、ORM というやつです。

    選定の理由は、利用者も多くコミュニティも活発だからです!

    テーブルを用意

    MySQL に下記のテーブルを用意します。

    カラム名制約概要
    idINTEGERAuto Incremen

    Primary Key

    nameTEXT名前
    ageINTEGER年齢
    addressTEXT住所
    update_atDATETIME更新日時

    接続情報は下記とします。

    DB名Table名ユーザー名ホストパスワードPort
    go_exampleusersgo_examplelocalhost12345!3306

    実装

    それでは、接続の実装をしてみましょう。

    1package main
    2
    3import (
    4    "fmt"
    5
    6    _ "github.com/go-sql-driver/mysql"
    7    "github.com/jinzhu/gorm"
    8)
    9
    10func main() {
    11    _, err := sqlConnect()
    12    if err != nil {
    13        panic(err.Error())
    14    } else {
    15        fmt.Println("DB接続成功")
    16    }
    17}
    18
    19// SQLConnect DB接続
    20func sqlConnect() (database *gorm.DB, err error) {
    21    DBMS := "mysql"
    22    USER := "go_example"
    23    PASS := "12345!"
    24    PROTOCOL := "tcp(localhost:3306)"
    25    DBNAME := "go_example"
    26
    27    CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
    28    return gorm.Open(DBMS, CONNECT)
    29}

    接続情報の設定にミスがなれけば、ログに「DB接続成功」と出るはずです。

    構造体を用意してみよう

    接続が問題なく出来たので、データを色々操作するために、テーブル構造に沿った形で構造体を実装します。

    1// Users ユーザー情報のテーブル情報
    2type Users struct {
    3    ID       int
    4    Name     string `json:"name"`
    5    Age      string `json:"age"`
    6    Address  string `json:"address"`
    7    UpdateAt string `json:"updateAt" sql:"not null;type:date"`
    8}

    DATE型であるカラムの update_atで すが、string型として構造体を作成してます。

    理由としては、REST API として JSON で吐き出す際や、値を受け取る際のパースが string  のほうが簡単だったからです!

    ここは笹川の経験不足で上手く扱えなかったので、今記事では string  のまま進めます。

    データを追加してみよう

    GORM では、とても簡単にデータを追加できます。

    1db.Create(&Users{
    2        Name:     "テスト太郎",
    3        Age:      18,
    4        Address:  "東京都千代田区",
    5        UpdateAt: "2019-11-7 11:00:00",
    6    })

    なんと、たったこれだけで、データが追加できます。

    update_atカラムへのデータの生成は、別メソッドで作ります。

    1func getDate() string {
    2    const layout = "2006-01-02 15:04:05"
    3    now := time.Now()
    4    return now.Format(layout)
    5}

    現在日時を「 yyyy-MM-dd HH:mm:ss 」の文字列形式で生成します。

    データ接続から追加までを纏めると、こんな感じになります。

    1package main
    2
    3import (
    4    "fmt"
    5    "time"
    6
    7    _ "github.com/go-sql-driver/mysql"
    8    "github.com/jinzhu/gorm"
    9)
    10
    11func main() {
    12    // db接続
    13    db, err := sqlConnect()
    14    if err != nil {
    15        panic(err.Error())
    16    }
    17    defer db.Close()
    18
    19    error := db.Create(&Users{
    20        Name:     "テスト太郎",
    21        Age:      18,
    22        Address:  "東京都千代田区",
    23        UpdateAt: getDate(),
    24    }).Error
    25    if error != nil {
    26        fmt.Println(error)
    27    } else {
    28        fmt.Println("データ追加成功")
    29    }
    30}
    31
    32func getDate() string {
    33    const layout = "2006-01-02 15:04:05"
    34    now := time.Now()
    35    return now.Format(layout)
    36}
    37
    38// SQLConnect DB接続
    39func sqlConnect() (database *gorm.DB, err error) {
    40    DBMS := "mysql"
    41    USER := "go_example"
    42    PASS := "12345!"
    43    PROTOCOL := "tcp(localhost:3306)"
    44    DBNAME := "go_example"
    45
    46    CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
    47    return gorm.Open(DBMS, CONNECT)
    48}
    49
    50// Users ユーザー情報のテーブル情報
    51type Users struct {
    52    ID       int
    53    Name     string `json:"name"`
    54    Age      int    `json:"age"`
    55    Address  string `json:"address"`
    56    UpdateAt string `json:"updateAt" sql:"not null;type:date"`
    57}

    「テスト太郎」が追加されたら成功です!

    データの取得をしてみましょう

    では、追加したデータを表示させたいと思います。

    特に、検索条件がない場合は、とても簡単です。

    1package main
    2
    3import (
    4    "fmt"
    5    "time"
    6
    7    _ "github.com/go-sql-driver/mysql"
    8    "github.com/jinzhu/gorm"
    9)
    10
    11func main() {
    12    // db接続
    13    db, err := sqlConnect()
    14    if err != nil {
    15        panic(err.Error())
    16    }
    17    defer db.Close()
    18    addUserData(db)
    19
    20    result := []*Users{}
    21    error := db.Find(&result).Error
    22    if error != nil || len(result) == 0 {
    23        return
    24    }
    25    for _, user := range result {
    26        fmt.Println(user.Name)
    27    }
    28}

    もちろん、「検索」をするのも簡単です。

    1db.Where("name LIKE ?", "%テスト%").Find(&result)

    このように、LIKE検索なども、サクッと実装できてします。

    クエリについては、以下の公式ドキュメントを参考にすれば、大体のことは出来るはずです!

    【公式ドキュメント】
    http://gorm.io/ja_JP/docs/query.html

    データの取得までで結構なボリュームになってしまったので、「データの更新」と「削除」は次回にやりたいと思います!

    第13回へつづく!

    GORMを使うと、Golang(Go言語)でMySQLを扱うのが格段に楽になります。

    Golang(Go言語)と RDBMS の親和性は、あまり高くないと聞いたことがありますが、それでも使いたい人は多いハズ!

    GORM を使って、みんなで楽しましょう!

    次回の記事はこちら

    featureImg2019.12.04【第13回】Go言語(Golang)入門~MySQL利用編~第13回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、前回に引き続き My...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事