从 Gorm 传入查询的 Postgres 数据类型不正确
在使用 Gorm 进行 Postgres 数据库查询时,有时会遇到一个常见的问题:“从 Gorm 传入查询的 Postgres 数据类型不正确”。这个问题可能会导致查询结果不准确,给开发者带来困扰。在本文中,php小编鱼仔将为您解析这个问题的原因,并提供解决方案,帮助您正确处理数据类型,确保查询结果的准确性。
问题内容
我正在尝试在 api 中创建一个端点来创建公司。在公司模型中,我有一个 []string
用于存储与允许用户注册的电子邮件相关的允许列出的域。
[]字符串最初是从数组的 json post 请求映射的,并在 postgres 中分配了 text[] 类型。
alloweddomains []string `gorm:"type:text[];default:null" json:"alloweddomains" binding:"required"`
使用 create()
的完整模型
// company is the primary struct type for companies type company struct { common.base name string `gorm:"unique;default:not null" json:"name" binding:"required"` primarycontactname string `gorm:"unique;default:not null" json:"primarycontactname" binding:"required"` primarycontactemail string `gorm:"unique;default:not null" json:"primarycontactemail" binding:"required"` primarycontactphone string `gorm:"unique;default:not null" json:"primarycontactphone" binding:"required"` secondarycontactname string `gorm:"unique;default:null" json:"secondarycontactname"` secondarycontactemail string `gorm:"unique;default:null" json:"secondarycontactemail"` secondarycontactphone string `gorm:"unique;default:null" json:"secondarycontactphone"` primarydomain string `gorm:"unique;default:not null" json:"primarydomain" binding:"required"` alloweddomains []string `gorm:"type:text[];default:null" json:"alloweddomains" binding:"required"` mfaenabled bool `gorm:"not null" json:"mfaenabled" binding:"required"` isvalidated bool `gorm:"not null"` } func (c *company) create() error { if result := common.db.create(c); result.error != nil { log.printf("error creating company: %s", c.name) return result.error } else { log.printf("successfully created company: %s", c.name) return nil } }
在实现这个过程中,我遇到了两个问题。
首先,当 alloweddomains
包含单个字符串时,该值不会作为数组写入 postgres,而是作为单个字符串写入。
api | 2023/04/10 19:05:50 /go/src/api/company/model.go:25 error: malformed array literal: "website.co.uk" (sqlstate 22p02) api | [2.006ms] [rows:0] insert into "companies" ("created_at","updated_at","deleted_at","name","primary_contact_name","primary_contact_email","primary_contact_phone","primary_domain","mfa_enabled","is_validated","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains") values ('2023-04-10 19:05:50.551','2023-04-10 19:05:50.551',null,'foo company ltd.','foo','bar','00000000000','website.com',true,false,'foo2','bar2','11111111111',('website.co.uk')) returning "id","uuid","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains" api | [gin] 2023/04/10 - 19:05:50 | 500 | 3.043083ms | 172.21.0.1 | post "/api/company/register" api | 2023/04/10 19:05:50 error creating company: foo company ltd. api | 2023/04/10 19:05:50 error: malformed array literal: "website.co.uk" (sqlstate 22p02) postgres | 2023-04-10 19:06:35.523 utc [19] error: column "allowed_domains" is of type text[] but expression is of type record at character 336 postgres | 2023-04-10 19:06:35.523 utc [19] hint: you will need to rewrite or cast the expression. postgres | 2023-04-10 19:06:35.523 utc [19] statement: insert into "companies" ("created_at","updated_at","deleted_at","name","primary_contact_name","primary_contact_email","primary_contact_phone","primary_domain","mfa_enabled","is_validated","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains") values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,($14,$15)) returning "id","uuid","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains"
其次,当 json 数组包含 > 1 值时,写入数据库的类型为 record
类型,而不是 text[]
api | 2023/04/10 19:06:35 /go/src/api/company/model.go:25 ERROR: column "allowed_domains" is of type text[] but expression is of type record (SQLSTATE 42804) api | [2.502ms] [rows:0] INSERT INTO "companies" ("created_at","updated_at","deleted_at","name","primary_contact_name","primary_contact_email","primary_contact_phone","primary_domain","mfa_enabled","is_validated","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains") VALUES ('2023-04-10 19:06:35.522','2023-04-10 19:06:35.522',NULL,'Foo Company Ltd.','Foo','Bar','00000000000','website.com',true,false,'Foo2','Bar2','11111111111',('website.co.uk','website.net')) RETURNING "id","uuid","secondary_contact_name","secondary_contact_email","secondary_contact_phone","allowed_domains" api | [GIN] 2023/04/10 - 19:06:35 | 500 | 3.256334ms | 172.21.0.1 | POST "/api/company/register" api | 2023/04/10 19:06:35 Error creating company: Foo Company Ltd. api | 2023/04/10 19:06:35 ERROR: column "allowed_domains" is of type text[] but expression is of type record (SQLSTATE 42804)
当我设置断点并在序列化后分析 company
类型时,很明显 alloweddomains
的类型是正确的。
我在这里缺少什么想法或者解决这个问题的最佳方法吗?
解决方法
根据 mkopriva 的评论,解决方案是使用 pq
包,如下所示。
package company import ( "github.com/lib/pq" "log" ) // Company is the primary struct type for companies type Company struct { ... AllowedDomains pq.StringArray `gorm:"type:text[];default:NULL" json:"allowedDomains" binding:"required"` } func (c *Company) Create() error { a := pq.StringArray{} if c.AllowedDomains != nil && len(c.AllowedDomains) > 0 { for _, v := range c.AllowedDomains { a = append(a, v) } c.AllowedDomains = a } if result := common.Db.Create(c); result.Error != nil { log.Printf("Error creating company: %s", c.Name) return result.Error } else { log.Printf("Successfully created company: %s", c.Name) return nil } }
以上是从 Gorm 传入查询的 Postgres 数据类型不正确的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

注册铁路12306电子邮箱的步骤如下:访问12306网站,点击“注册”;选择“邮箱注册”,填写邮箱、姓名、手机等信息;根据提示设置密码和安全问题;输入邮箱验证码和手机验证码验证信息;点击“完成注册”即可。

网易《漫威超级战争》宣布将于2024年6月17日15时终止运营并关闭游戏服务器。现在已关闭全平台下载入口,停止游戏充值、新用户注册。作为漫威的首款MOBA手游,这款游戏原汁原味地展现了超级英雄的战斗特色,还原了漫威宇宙宏大的世界观。在游戏中,您将能够与复仇者联盟、X战警、神奇四侠以及众多超级英雄和超级反派一起集结于平行宇宙,与钢铁侠、美国队长、蜘蛛侠、洛基、灭霸、死侍等超过60位经典漫威角色共同战斗!

无法注册BitgetWallet交易所的原因有多种,包括账户限制、不支持的地区、网络问题、系统维护和技术故障。要注册BitgetWallet交易所,请访问官网、填写信息、同意条款、完成注册并验证身份。

如何注册和充值 Gate.io 账户:1.访问 Gate.io 官网并点击“注册”。2.选择注册方式(电子邮件或手机)、设置密码、同意条款。3.登录账户,点击“充值”。4.选择法币或加密货币充值,输入金额,选择充值方式。5.获取充值地址,从外部钱包或交易所转账。

在数字化时代,社交媒体已成为人们生活中不可或缺的一部分。抖音,作为国内最受欢迎的短视频平台之一,吸引了大量用户。有些用户甚至注册了两个账号,那么,抖音为什么有两个账号呢?本文将为您解答这个问题,并介绍如何在手机上安装两个抖音账号。一、抖音为什么有两个账号?功能区分:某些用户会根据内容类型或功能来区分账户,比如一个账户用于分享生活日常,另一个账户用于展示专业技能。2.隐私保护:有些用户希望通过两个账号来保护自己的隐私,将生活和工作分离,避免信息泄露。3.互动需求:有些用户可能因为互动需求而注册两个

抖音,作为时下最热门的短视频平台,吸引了无数用户注册和分享。有些用户可能会注册多个抖音账号,用于不同的用途。抖音允许用户将多个账号关联起来,方便管理。但有些时候,用户可能需要解除账号之间的关联。本文将围绕“抖音多个账号关联怎么关闭”展开,详细介绍关闭账号关联的方法,以及账号关联的作用。一、抖音多个账号关联怎么关闭?1.打开抖音APP,进入“我”个人主页。2.点击右上角的“三条杠”图标,打开功能菜单。3.在功能菜单中,找到“设置”选项,点击进入。4.在设置页面中,找到“账号与安全”选项,点击进入。

海外USDT交易所是境外注册和运营的,主要基于USDT进行交易的数字货币交易平台。主要特点包括:支持USDT交易、全球服务、流动性高、支持多种币种和法币出入金渠道。在选择海外USDT交易所时,应考虑安全性、交易费用、币种支持、法币出入金和客服支持。知名交易所包括币安、火币、欧易、Coinbase。

抖音平台为了增强用户互动和提升用户体验,推出了火花这一有趣的互动机制。用户通过在抖音上的一系列行为,可以激活并升级自己的火花,不同的颜色代表着不同的成就和荣誉。了解抖音火花的变色规则,可以帮助用户更好地参与和互动,享受抖音带来的社交乐趣。一、抖音火花变色规则详解是什么?1.行为激活用户的互动行为,如点赞、评论、分享等,可以激活火花。2.等级提升随着用户互动行为的增加,火花会逐渐升级,颜色也会随之变化。3.颜色变化火花的颜色变化通常与用户的互动频率、互动质量以及参与活动的积极性相关。4.任务完成完
