[[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| ```