[Go] Gorm - ERROR: cached plan must not change result type (SQLSTATE 0A000)
๋ค๋ฅธ ํ๊ฒฝ์ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, gorm-postgres์๋ ์น๋ช
์ ์ธ ๊ธฐ๋ฅ ๊ฒฐํจ์ด ์๋ค.
ํ
์ด๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธฐ๋ฉด, ํ์ํธํ์ด ๋ณด์ฅ๋๋ ๋ณ๊ฒฝ์ด๋ผ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ด ๋ป๋ ๋ฌธ์ ๋ค.
package main
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type User struct {
ID int
Name string
}
func main() {
dsn := "host=localhost user=postgres password=... dbname=postgres port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
if err := db.AutoMigrate(&User{}); err != nil {
panic(err)
}
// ์ค๋ ๋ 5๊ฐ ๋์์ ๋ฌดํ ๋ฃจํ ๋๋ฆฌ๊ธฐ
for i := 0; i < 5; i++ {
go func() {
for {
var user User
if result := db.Find(&user); result.Error != nil {
panic(result.Error)
}
}
}()
}
for {
}
}
๊ทธ๋ฅ ์ด๋ ๊ฒ ๊ฝ๋๊ฑฐ ๋๋ ค๋๊ณ
์ปฌ๋ผ ํ๋๋ง ์ถ๊ฐํด๋
๋ป๋๋ค.
์ด์ ๋ค์ด๊ฐ๋ณด๋ postgres ๋๋ผ์ด๋ฒ ํ๊ณ๋ฅผ ๋๋๋ฐ, entgo ๊ฐ์๊ฑด ์ด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
PreferSimpleProtocol ์ฌ์ฉ
postgres config๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฃ๊ณ PreferSimpleProtocol๋ผ๋ ํน์ ์ต์ ์ ๋ฃ์ผ๋ฉด ์ ์บ์ ๋ฌธ์ ๋ฅผ ํํผํ ์ ์๋ค. ๊ตฌํ์ ์ด์ํ๊ฒ ํด๋๊ณ ์ ์ต์ ์ ์ผ์ ํด๊ฒฐํ๋ผ๋๊ฑด์ง ์ดํด๋ ์ ์๋์ง๋ง...

์๋ฌดํผ ์ด๋ฌ๋ฉด ์ต์ํ ์บ์ ๋ฌธ์ ๋ก ํฐ์ง์ง๋ ์๋๋ค.
๊ทผ๋ฐ ์ด๊ฒ prepared statement ์บ์ฑ์ ๋นํ์ฑํํ๋๊ฑฐ๋ผ๊ณ ํ๋๋ฐ, ๋ด๊ฐ ์์ ์ ์๋ํด๋ดค๋ ๊ธฐ์ต์ผ๋ก๋ ์บ์ฑ๋ง ๋นํ์ฑํํ๋๊ฒ ์๋๋ผ ๋๋ผ์ด๋ฒ์ ์ ๋ฐ์ ์ธ ๋์ ๋ฐฉ์์ด ๋ฐ๋๋ค.
๊ธฐ์กด ๋์์ด ์ ๋ถ ํธํ๋์ง ์๊ณ ํ์
๋ณํ๊ฐ์๊ฒ ๊ฐ๋ก๊ฐ์ด ๋ฐ๋์ด์ ์๋ํ๋ค๊ฐ ๊ทธ๋ฅ ํฌ๊ธฐํ๋ ๊ธฐ์ต์ด ์๋ค.
๋๋์ฒด ์ด๋ป๊ฒ ๋ง๋ ๊ฑฐ์ง?
๊ทธ๋ฅ Gorm์ ์ฐ์ง ์๋๊ฑธ ๊ถํ๋ค.