[[GORM]]を使って[[PostgreSQL]]からデータを取得してみる。
<div class="link-card">
<div class="link-card-header">
<img src="https://gorm.io/favicon-32x32.png" class="link-card-site-icon"/>
<span class="link-card-site-name">GORM</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GORM</p>
</div>
<div class="link-card-description">
The fantastic ORM library for Golang aims to be developer friendly.
</div>
</div>
</div>
<a href="https://gorm.io/"></a>
</div>
## 前提
- [[Go]]
- v1.21.4
- [[PostgreSQL]]
- PostgreSQL 16.0 (Debian 16.0-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
## インストール
```console
go get -u gorm.io/gorm
go get -u gorm.io/driver/postgres
```
## [[PostgreSQL]]のDBコンテナを準備
[[Docker]]で構築する。
```console
docker run --name postgres-sample \
-p 5432:5432 \
-e POSTGRES_PASSWORD=password \
-d postgres
```
## データを追加する
`humen`テーブルを作成し、データを2つ挿入して1つ取得するコードを書いてみた。
```go
package main
import (
"fmt"
"time"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type Human struct {
ID uint
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
func main() {
db, err := gorm.Open(postgres.Open("postgres://postgres:password@localhost:5432"), &gorm.Config{})
if err != nil {
panic(err)
}
// テーブル作成
db.AutoMigrate(&Human{})
// データ挿入
db.Create(&Human{
ID: 180702,
Name: "yakuta",
}).Create(&Human{
ID: 100347,
Name: "tadashi",
})
// primary keyでデータ取得
var yakuta Human
db.First(&yakuta, 180702)
// 表示
fmt.Printf("%v\n", yakuta)
// {180702 yakuta 2023-11-13 23:19:50.311244 +0900 JST 2023-11-13 23:19:50.311244 +0900 JST}
}
```
以下のようにデータが挿入される。
```sql
> select * from humen;
id |name |created_at |updated_at |
------+-------+-----------------------------+-----------------------------+
180702|yakuta |2023-11-13 23:19:50.311 +0900|2023-11-13 23:19:50.311 +0900|
100347|tadashi|2023-11-13 23:19:50.312 +0900|2023-11-13 23:19:50.312 +0900|
```
## データを削除する
`main()`のコードを変更。
```go
func main() {
db, err := gorm.Open(postgres.Open("postgres://postgres:password@localhost:5432"), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&Human{})
var tadashi Human
db.First(&tadashi, "name like ?", "%ashi%")
fmt.Printf("%v\n", tadashi)
// {100347 tadashi 2023-11-13 23:19:50.312837 +0900 JST 2023-11-13 23:19:50.312837 +0900 JST}
db.Delete(&tadashi)
db.First(&tadashi, "name like ?", "%ashi%")
// /home/tadashi-aikawa/work/go-study/main.go:31 record not found
fmt.Printf("%v\n", tadashi)
// {100347 tadashi 2023-11-13 23:19:50.312837 +0900 JST 2023-11-13 23:19:50.312837 +0900 JST}
}
```
`name="tadashi"`のレコードが消えていることが確認できる。
```sql
> select * from humen;
id |name |created_at |updated_at |
------+------+-----------------------------+-----------------------------+
180702|yakuta|2023-11-13 23:19:50.311 +0900|2023-11-13 23:19:50.311 +0900|
```
## データを更新する
`main()`のコードを変更。
```go
func main() {
db, err := gorm.Open(postgres.Open("postgres://postgres:password@localhost:5432"), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&Human{})
db.Model(&Human{}).Where("name = ?", "yakuta").Update("name", "T")
var t Human
db.Model(&Human{}).Where("name = ?", "T").Find(&t)
fmt.Printf("%v\n", t)
// {180702 T 2023-11-13 23:19:50.311244 +0900 JST 2023-11-13 23:43:47.642911 +0900 JST}
}
```
`name="T"`に変わっており、`updated_at`のみが更新されていることを確認。
```sql
> select * from humen;
id |name|created_at |updated_at |
------+----+-----------------------------+-----------------------------+
180702|T |2023-11-13 23:19:50.311 +0900|2023-11-13 23:43:47.642 +0900|
```