【第12回】Go言語(Golang)入門~MySQL接続編~
IT技術
第12回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です!
今回は、データベース系の第3弾!
Firestore、ObjectBox とやってきたので、データベースとしては、王道の1つであるMySQLを使ってみようと思います。
ただ、MySQL のインストールや構築は省略させていただきます。
それでは、いってみましょう!
前回の記事はこちら
2019.11.20【第11回】Go言語(Golang)入門~FCM送信編~第11回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、Firebase C...
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 |
実装
それでは、接続の実装をしてみましょう。
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 を使って、みんなで楽しましょう!
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!