[Golang]GORMでデータベースを操作する

前回、MySQLにGORMを使って接続してデータを保存してみました。

今回はGORMを使った基本的なCRUDを行なっていきたいと思います。

Create

いわゆるINSERT文です。前回もやっていましたがもう一度。

user.ID = 0
user.NAME = "Hundread"
user.Description = "Chain Novel Posting Pratform!"

db.Create(&user)

これでデータベースに保存されます。

現在、テーブルはこんな感じ。

mysql> select * from users;
+----+----------+-------------------------------+
| id | name     | description                   |
+----+----------+-------------------------------+
|  1 | YouJ     | High School Student!          |
|  2 | Hundread | Chain Novel Posting Pratform! |
+----+----------+-------------------------------+
2 rows in set (0.00 sec)

Read

SELECT文にあたるのかな。

id指定で一つのレコードを見つけてくるにはこう。

// SELECT * FROM `users`  WHERE (`users`.`id` = 2) ORDER BY `users`.`id` ASC LIMIT 1
db.Find(&user, 2)

fmt.Println(user.NAME) // -> Hundread

最初のレコードを取ってみる。

// SELECT * FROM `users`   ORDER BY `users`.`id` ASC LIMIT 1
db.First(&user)

fmt.Println(user.NAME) // -> YouJ

では、最後のレコードは?

// SELECT * FROM `users`   ORDER BY `users`.`id` DESC LIMIT 1
db.Last(&user)

fmt.Println(user.NAME) // -> Hundread

全部取得はこんな感じでおっけー!

// SELECT * FROM `users
db.Find(&users)

for i, user := range users {
  fmt.Println(i, user.NAME) // -> 0 YouJ 1 Hundread
}

もちろんwhere文も使えます。一番最初にYouJにヒットしたものを見つけましょう。

// SELECT * FROM `users`  WHERE (NAME = 'YouJ') ORDER BY `users`.`id` ASC LIMIT 1
db.Where("NAME = ?", "YouJ").First(&user)

fmt.Println(user.NAME) // -> YouJ

Notも使えます。YouJではない最初のユーザーを見つけます。

// SELECT * FROM `users`  WHERE (`users`.`NAME` NOT IN ('YouJ')) ORDER BY `users`.`id` ASC LIMIT 1
db.Not("NAME", "YouJ").First(&user)

fmt.Println(user.NAME)

Update

次はアップデート文ですね!

まずは全てのフィールドを更新します。

db.First(&user)
fmt.Println(user.NAME) // -> YouJ

// UPDATE `users` SET `name` = '@jyouj__', `description` = 'It`s Twitter username'  WHERE `users`.`id` = 1
user.NAME = "@jyouj__"
user.Description = "It`s Twitter username"
db.Save(&user)
fmt.Println(user.NAME) // -> @jyouj__

特定のフィールドだけをアップデートします。

db.Find(&user, 2)
fmt.Println(user.NAME)

// UPDATE `users` SET `name` = 'Gachat News'  WHERE `users`.`id` = 2
db.Model(&user).Update("NAME", "Gachat News")
fmt.Println(user.NAME, ":", user.Description) // -> Gachat News : Chain Novel Posting Pratform!

Delete

最後にdelete文をやってみます。

db.Delete(&user, 2)

実際に消えているか確認してみましょう。

mysql> select * from users;
+----+----------+-----------------------+
| id | name     | description           |
+----+----------+-----------------------+
|  1 | @jyouj__ | It`s Twitter username |
+----+----------+-----------------------+
1 row in set (0.00 sec)

まとめ

GORMでの操作はもっとあるので、こちらのドキュメントをみてみるといいと思います。

機会があれば、ManyToManyなどモデル間の関係なども書いてみようと思います。