[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์„ ์“ฐ์ง€ ์•Š๋Š”๊ฑธ ๊ถŒํ•œ๋‹ค.



์ฐธ์กฐ
https://github.com/go-gorm/gorm/issues/3335