[[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"` } ``` テーブルにはこれらが当然あるよね?という意味で用意されたものなのかな...。