[[GORM]]を使って[[MySQL]]からデータを取得してみる。
## 前提
- [[Go]]
- v1.18.2
- [[MySQL]]
- `mysql Ver 8.0.29 for Linux on x86_64 (MySQL Community Server - GPL)`
## インストール
```console
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
```
## コード
テーブルのレコード定義。
```go
type Animal struct {
Id int `gorm:"primaryKey"`
Name string
}
```
全件取得。
```go
func main() {
db, err := gorm.Open(mysql.Open("username:password@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
var animals []Animal
r := db.Find(&Animal)
// animalsに結果が入る
}
```
## コネクションについて
[[Echo]]でAPIを作成し、そこから毎回[[GORM]]のコネクションを確立するような実装で、コネクションの数を計測してみた。APIにアクセスするたびにどんどん増えていく。以下は20数回実行した後の状態
```
mysql> show global status like 'Threads%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 23 |
| Threads_created | 23 |
| Threads_running | 2 |
+-------------------+-------+
4 rows in set (0.00 sec)
```
明示的にコネクションをクローズしなければ、どんどん貯まっていくようだ。クローズの方法は下記。
https://gorm.io/docs/generic_interface.html
```go
sqlDB, err := db.DB()
sqlDB.Close()
```
## ゴルーチンについて
[[ゴルーチン]]についは以下の記述もある。
http://disq.us/p/2cqnyuq
> Please note that when new connection is open, a new goroutine with memory consumption of 8kB is created.
This goroutine is closed when program is exited, or when connection is closed.
You can manually close connection using
sqlDB, err := db.DB()
sqlDB.Close()
- コネクションが開かれると[[ゴルーチン]]が確保される
- ゴルーチンが終了するのはプログラム終了時またはコネクションクローズ時
この条件を満たさなければ8kBの[[ゴルーチン]]はどんどん増えていく。
## FAQ
### テーブル名を変えたい
https://gorm.io/docs/conventions.html#Pluralized-Table-Name
```go
type Animal struct {
gorm.Model
Id int
Name string
}
func (Animal) TableName() string {
return "t_animal"
}
```
### 変なWHEREがついてくる
> `deleted_at` IS NULL
`gorm.Model`のせい。
```go
type Animal struct {
gorm.Model
Id int
Name string
}
```
`gorm.Model`の定義を見ると
```go
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
```
テーブルにはこれらが当然あるよね?という意味で用意されたものなのかな...。