こんにちは、洸です!今回は15分で学習するGo言語チュートリアルの第2回です。
-
-
おすすめ【Go言語入門】外部パッケージを使って設定ファイルを読み込む【第1回】
こんにちは、洸です!この度、1回15分でGo言語を学習できるチュートリアルを用意しました。第1回目はパッケージ管理ツールを導入して、外部パッケージを使って設定ファイルの読み込み行いたいと思います。Go言語では機能やオブジェクト毎にパッケージ化を行い、そのパッケージをインポートしてプログラムを記述します。
続きを見る
第2回目はGORMを使ってMySQLをCRUD操作(Create、Read、Update、Delete)をしていきたいと思います。
GORMとは、Go言語用のORMライブラリで、ORMとはObject Relational Mappingの略です。
Go言語の場合は、オブジェクト(構造体)をORMに渡してやることで、SQLを直接記述せずに、簡単に関係データベース(RDS)を操作することができます。
ここでは、データベースを簡単に扱えるツール程度の理解で大丈夫です。
パッケージインストール
それではやっていきましょう。まずは必要なパッケージのインストールを行います。今回はMySQLを使用するので、MySQLのドライバもインストールします。
1 2 |
% go get -u gorm.io/gorm % go get -u gorm.io/driver/mysql |
ユーザテーブル
今回は、3つのカラムを持つusersテーブルを例に説明したいと思います。Go側で以下のような構造体Userを用意します。GORMは、Userを使ってDBとのやり取りを行います。
1 2 3 4 5 |
type User struct { UserId string UserName string Password string } |
GORMオブジェクトの取得
※この記事では、MySQLのインストール方法は省略します。以下のような関数を定義し、戻り値としてGORMオブジェクト(コネクション)を返します。
1 2 3 4 |
func getDB() (*gorm.DB, error) { dsn := "ユーザ:パスワード@tcp(localhost:3306)/データベース名?charset=utf8mb4&parseTime=True&loc=Local" return gorm.Open(mysql.Open(dsn), &gorm.Config{}) } |
dsnとは、Data Source Nameの略でデータベースの接続情報のことです。ユーザ、パスワード、データベース名は任意の値に書き換えてください。
また、第2引数の&gorm.Config{}は、GORMの設定オプションです。トランザクションやログなどのオプション設定が可能ですが、まずはデフォルトのままで問題ありません。
Create
まずは、データの作成処理です。順に解説していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func (u *User) Create(tableName string) error { db, err := getDB() if err != nil { return err } sqlDb, err := db.DB() if err != nil { return err } defer sqlDb.Close() err = db.Table(tableName).Create(u).Error if err != nil { return err } return nil } |
第1行:func (u *User) Create(tableName string) error {
Userのメソッドを定義しています。事前にu *Userに必要な情報をセットし、後にuをGORMに渡します。
第2行:db, err := getDB()
先ほど作成したgetDb関数を呼び出し、GORMオブジェクトを取得します。
第6行:sqlDb, err := db.DB()
GORMオブジェクトには接続をクローズするメソッドが存在しないので、sql.DBオブジェクトを取得し、後にコネクションのクローズを行います。
第10行:defer sqlDb.Close()
処理完了時に接続をクローズしています。
第12行:err = db.Table(tableName).Create(u).Error
Create操作です。Table()でテーブル名を指定し、Create()ではUserオブジェクトを渡すことで、データの作成を行います。また、最後に.Error()を付け加えることでエラーハンドリングをすることができます。
Read
続いてデータの読み込み処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
func (u *User) Read(tableName string) (User, error) { user := User{} db, err := getDB() if err != nil { return user, err } sqlDb, err := db.DB() if err != nil { return user, err } defer sqlDb.Close() result := []*User{} err = db.Table(tableName).Select("user_id,user_name,password").Where("user_id = ?", u.UserId).Scan(&result).Error if err != nil { return user, err } for _, r := range result { user.UserId = r.UserId user.UserName = r.UserName user.Password = r.Password } return user, nil } |
第1〜11行
Createと同様の処理を行っています。
第13行:result := []*User{}
DBから読み込んだ値がresultに保持されます。
第14行:err = db.Table(tableName).Select("user_id,user_name,password").Where("user_id = ?", u.UserId).Scan(&result).Error
Table()でテーブル名を指定、Select()で取得するカラム名を指定、Where()で条件を指定しています。また.Scan(&result)を付け加えることで、結果の値をゲットすることができます。また、Createと同じく.Errorでエラーハンドリングを行います。
Update
データの更新処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func (u *User) Update(tableName string) error { db, err := getDB() if err != nil { return err } sqlDb, err := db.DB() if err != nil { return err } defer sqlDb.Close() err = db.Table(tableName).Where("user_id = ?", u.UserId).Update("user_name", u.UserName).Error if err != nil { return err } return nil } |
処理の中身はほとんど同じで、Where()で更新対象の条件を指定し、Update()で更新カラムを指定してしています。
Delete
データの削除処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func (u *User) Delete(tableName string) error { db, err := getDB() if err != nil { return err } sqlDb, err := db.DB() if err != nil { return err } defer sqlDb.Close() err = db.Table(tableName).Where("user_id = ?", u.UserId).Delete(u).Error if err != nil { return err } return nil } |
main関数
最後に上記の4つ関数を一通り呼び出してみましょう。順番は以下の通りです。
Create→Read→Update→Read→Delete→Read
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 58 59 60 61 |
func main() { // テーブル名 tableName := "users" u := &User{} // パラメータ設定 u.UserId = "00001" u.UserName = "myfuns" u.Password = "password" // データ作成 err := u.Create(tableName) if err != nil { fmt.Println(err) return } // データ読込 user, err := u.Read(tableName) if err != nil { fmt.Println(err) return } fmt.Println(user.UserId) fmt.Println(user.UserName) fmt.Println(user.Password) // データ更新 u.UserName = "ourfuns" err = u.Update(tableName) if err != nil { fmt.Println(err) return } // データ読込 user, err = u.Read(tableName) if err != nil { fmt.Println(err) return } fmt.Println(user.UserId) fmt.Println(user.UserName) fmt.Println(user.Password) // データ削除 err = u.Delete(tableName) if err != nil { fmt.Println(err) return } // データ読込 user, err = u.Read(tableName) if err != nil { fmt.Println(err) return } fmt.Println(user.UserId) fmt.Println(user.UserName) fmt.Println(user.Password) } |
実行してみます。
1 |
% go run main.go |
うまく動作できました。(データ作成→ユーザ名更新→削除)
最後に
いかがだったでしょうか?今回のチュートリアルでは、DBの基本操作を実装してみました。
今回はMySQLを使用しましたが、PostgreSQLやSQLiteなんかもサポートされているので、興味のある方は試してみてください。
お疲れ様でした!Goでゲームを作成した記事はこちら!
-
-
おすすめ【第1回】Go言語(ゲームエンジン:engo)でゲームを作成してみた
こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。本記事では、2Dゲームエンジンのengoを使用してゲームを作成していきます。プログラミング初心者の方でも分かりやすいように、ソースコードの説明もしっかり行いたいと思います。
続きを見る