本文分析了使用 golang 的 GORM 庫操作 postgresql 數據庫時,數據插入失敗的問題,并提供了相應的解決方案。
問題: 在使用 GORM 向 PostgreSQL 數據庫插入數據時,出現錯誤:“failed to encode args[3]: unable to encode 1 into text format for varchar (oid 1043): cannot find encode plan”。 雖然直接執行 SQL 語句可以成功插入,但 GORM 卻失敗了。
原因分析: 錯誤信息提示編碼失敗,原因在于 GORM 嘗試將 int 類型數據寫入數據庫中定義為 varchar 類型的字段。 這通常發生在 Go 結構體字段類型與數據庫表字段類型不匹配的情況下。
數據庫表結構 (DDL):
立即學習“go語言免費學習筆記(深入)”;
create table "public"."menu" ( "id" int4 not null generated always as identity ( increment 1 minvalue 1 maxvalue 2147483647 start 1 ), "title" varchar(255) collate "pg_catalog"."default", "router" varchar(255) collate "pg_catalog"."default", "state" varchar(255) collate "pg_catalog"."default", "sort" int4, "icon" varchar(255) collate "pg_catalog"."default", "created_at" timestamp(6), "updated_at" timestamp(6), "sid" int4 not null default 0 );
Go 結構體定義 (初始):
type menumodel struct { id int `gorm:"column:id" json:"id"` title String `gorm:"column:title" json:"title"` router string `gorm:"column:router" json:"router"` sid int `gorm:"column:sid" json:"sid"` state int `gorm:"column:state" json:"state"` // 類型不匹配 sort int `gorm:"column:sort" json:"sort"` icon string `gorm:"column:icon" json:"icon"` created_at time.time `gorm:"column:created_at;autocreatetime" json:"created_at"` updated_at time.time `gorm:"column:updated_at;autoupdatetime" json:"updated_at"` }
解決方案: 將 Go 結構體中 state 字段的類型從 int 修改為 string,使其與數據庫表中 state 字段的類型一致。
Go 結構體定義 (修正):
type MenuModel struct { Id int `json:"id"` Title string `json:"title"` Router string `json:"router"` Sid int `json:"sid"` State string `json:"state"` // 修改為 string Sort int `json:"sort"` Icon string `json:"icon"` Created_at time.Time `gorm:"autoCreateTime" json:"created_at"` Updated_at time.Time `gorm:"autoUpdateTime" json:"updated_at"` }
改進建議: GORM 支持根據字段名自動映射,因此除非需要自定義列名,否則可以省略 gorm:”column:…” 標簽,簡化代碼并提高可讀性。 如上所示的修正后的結構體已經去除了冗余的 gorm 標簽。
通過以上修改,GORM 應該能夠正確地將數據插入到 PostgreSQL 數據庫中。 記住保持 Go 結構體字段類型與數據庫表字段類型的一致性,以避免類似的類型轉換錯誤。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦