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

笹川先生
(株)ライトコードの笹川(ささがわ)です!
今回は、データベース系の第3弾!
Firestore、ObjectBox とやってきたので、データベースとしては、王道の1つであるMySQLを使ってみようと思います。
ただ、MySQL のインストールや構築は省略させていただきます。
それでは、いってみましょう!
前回の記事はこちら
2019.11.20Go言語(Golang)入門~第11回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、Fire...
MySQLと接続してみよう
今回は、「GORM」というライブラリを使います。
【GORM(ゴルム)】
https://gorm.io/
いわゆる、ORM というやつです。
選定の理由は、利用者も多くコミュニティも活発だからです!
テーブルを用意
MySQL に下記のテーブルを用意します。
| カラム名 | 型 | 制約 | 概要 |
| id | INTEGER | Auto Incremen Primary Key | ― |
| name | TEXT | | 名前 |
| age | INTEGER | | 年齢 |
| address | TEXT | | 住所 |
| update_at | DATETIME | | 更新日時 |
接続情報は下記とします。
| DB名 | Table名 | ユーザー名 | ホスト | パスワード | Port |
| go_example | users | go_example | localhost | 12345! | 3306 |
実装
それでは、接続の実装をしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ) func main() { _, err := sqlConnect() if err != nil { panic(err.Error()) } else { fmt.Println("DB接続成功") } } // SQLConnect DB接続 func sqlConnect() (database *gorm.DB, err error) { DBMS := "mysql" USER := "go_example" PASS := "12345!" PROTOCOL := "tcp(localhost:3306)" DBNAME := "go_example" CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo" return gorm.Open(DBMS, CONNECT) } |
接続情報の設定にミスがなれけば、ログに「DB接続成功」と出るはずです。
構造体を用意してみよう
接続が問題なく出来たので、データを色々操作するために、テーブル構造に沿った形で構造体を実装します。
| // Users ユーザー情報のテーブル情報 type Users struct { ID int Name string `json:"name"` Age string `json:"age"` Address string `json:"address"` UpdateAt string `json:"updateAt" sql:"not null;type:date"` } |
DATE型であるカラムの update_atで すが、string型として構造体を作成してます。
理由としては、REST API として JSON で吐き出す際や、値を受け取る際のパースが string のほうが簡単だったからです!
ここは笹川の経験不足で上手く扱えなかったので、今記事では string のまま進めます。
データを追加してみよう
GORM では、とても簡単にデータを追加できます。
| db.Create(&Users{ Name: "テスト太郎", Age: 18, Address: "東京都千代田区", UpdateAt: "2019-11-7 11:00:00", }) |
なんと、たったこれだけで、データが追加できます。
update_atカラムへのデータの生成は、別メソッドで作ります。
| func getDate() string { const layout = "2006-01-02 15:04:05" now := time.Now() return now.Format(layout) } |
現在日時を「 yyyy-MM-dd HH:mm:ss 」の文字列形式で生成します。
データ接続から追加までを纏めると、こんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package main import ( "fmt" "time" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ) func main() { // db接続 db, err := sqlConnect() if err != nil { panic(err.Error()) } defer db.Close() error := db.Create(&Users{ Name: "テスト太郎", Age: 18, Address: "東京都千代田区", UpdateAt: getDate(), }).Error if error != nil { fmt.Println(error) } else { fmt.Println("データ追加成功") } } func getDate() string { const layout = "2006-01-02 15:04:05" now := time.Now() return now.Format(layout) } // SQLConnect DB接続 func sqlConnect() (database *gorm.DB, err error) { DBMS := "mysql" USER := "go_example" PASS := "12345!" PROTOCOL := "tcp(localhost:3306)" DBNAME := "go_example" CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo" return gorm.Open(DBMS, CONNECT) } // Users ユーザー情報のテーブル情報 type Users struct { ID int Name string `json:"name"` Age int `json:"age"` Address string `json:"address"` UpdateAt string `json:"updateAt" sql:"not null;type:date"` } |
「テスト太郎」が追加されたら成功です!
データの取得をしてみましょう
では、追加したデータを表示させたいと思います。
特に、検索条件がない場合は、とても簡単です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package main import ( "fmt" "time" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ) func main() { // db接続 db, err := sqlConnect() if err != nil { panic(err.Error()) } defer db.Close() addUserData(db) result := []*Users{} error := db.Find(&result).Error if error != nil || len(result) == 0 { return } for _, user := range result { fmt.Println(user.Name) } } |
もちろん、「検索」をするのも簡単です。
| db.Where("name LIKE ?", "%テスト%").Find(&result) |
このように、LIKE検索なども、サクッと実装できてします。
クエリについては、以下の公式ドキュメントを参考にすれば、大体のことは出来るはずです!
【公式ドキュメント】
http://gorm.io/ja_JP/docs/query.html
データの取得までで結構なボリュームになってしまったので、「データの更新」と「削除」は次回にやりたいと思います!
さいごに
GORMを使うと、Golang(Go言語)でMySQLを扱うのが格段に楽になります。
Golang(Go言語)と RDBMS の親和性は、あまり高くないと聞いたことがありますが、それでも使いたい人は多いハズ!
GORM を使って、みんなで楽しましょう!
関連記事
2019.09.13Go言語(Golang)を習得したい! 笹川先生 (株)ライトコードでモバイルアプリケーション開発をしている笹川(ささが...
2019.09.17Go言語(Golang)を習得したい!~第2回~
(株)ライトコードの笹川(ささがわ)です。 前回に引き続き、今回もGo言語(Gol...
2019.09.26Go言語(Golang)入門~第3回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です。 今回でGo言語(G...
2019.10.02Go言語(Golang)入門~第4回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です 今回も、Go言語(G...
2019.10.09Go言語(Golang)入門~第5回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、RESR ...
2019.10.17Go言語(Golang)入門~第6回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 先日、Twitte...
2019.10.23Go言語(Golang)入門~第7回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引き...
2019.10.30Go言語(Golang)入門~第8回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Twitt...
2019.11.06Go言語(Golang)入門~第9回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 前回は、Goの環境...
2019.11.13Go言語(Golang)入門~第10回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、前回に引...
2019.11.20Go言語(Golang)入門~第11回目~ 笹川先生 (株)ライトコードの笹川(ささがわ)です! 今回は、Fire...
ライトコードよりお知らせ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ

にゃんこ師匠

ミツオカ
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね! 一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!
当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。
また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!
なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。
書いた人はこんな人
- 笹川 (社員)
- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!