• トップ
  • ブログ一覧
  • 【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)
    笹川(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background