电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

在golang xorm中使用postgresql的json,array類型的操作

瀏覽:153日期:2024-05-29 15:59:40

xorm支持各種關(guān)系數(shù)據(jù)庫,最近使用postgresql時,總是踩到一些坑,在此記錄下解決方式。

在使用postgresql的array類型時,查詢有點(diǎn)問題,xorm的官方文檔給出重寫的方式,但是不是很清晰:

官方文檔鏈接:http://xorm.io/docs

在golang xorm中使用postgresql的json,array類型的操作

也就是說碰到基礎(chǔ)庫不支持的類型,需要我們?nèi)ブ貙慣oDB、FromDB方法,廢話不多說直接上代碼:

比如int8[]類型,自定一個Int64Array

type Int64Array []int64func (s *Int64Array) FromDB(bts []byte) error {if len(bts) == 0 {return nil}str := string(bts)if strings.HasPrefix(str, '{') {str = '[' + str[1:len(str)]}if strings.HasSuffix(str, '}') {str = str[0: len(str)-1] + ']'}var ia = &[]int64{}err := json.Unmarshal([]byte(str), ia)if err != nil {return err}*s = Int64Array(*ia)return nil}func (s *Int64Array) ToDB() ([]byte, error) {return serializeBigIntArray(*s, '{', '}'), nil}func (arr Int64Array) MarshalJSON() ([]byte, error) {return serializeBigIntArrayAsString(arr, '[', ']'), nil}func (arr *Int64Array) UnmarshalJSON(b []byte) error {var strarr []stringvar intarr []int64err := json.Unmarshal(b, &strarr)if err != nil {return err}for _, s := range strarr {i, err := strconv.ParseInt(s, 10, 64)if err != nil {return err}intarr = append(intarr, i)}*arr = intarrreturn nil}func serializeBigIntArray(s []int64, prefix string, suffix string) []byte {var buffer bytes.Bufferbuffer.WriteString(prefix)for idx, val := range s {if idx > 0 {buffer.WriteString(',')}buffer.WriteString(strconv.FormatInt(val, 10))}buffer.WriteString(suffix)return buffer.Bytes()}func serializeBigIntArrayAsString(s []int64, prefix string, suffix string) []byte {var buffer bytes.Bufferbuffer.WriteString(prefix)for idx, val := range s {if idx > 0 {buffer.WriteString(',')}buffer.WriteString(''')buffer.WriteString(strconv.FormatInt(val, 10))buffer.WriteString(''')}buffer.WriteString(suffix)return buffer.Bytes()}json類型:

type Cover struct { Id int64 `json:'id,omitempty'` Fid string `json:'fid,omitempty'` Type int8 `json:'type,omitempty'` Url string `json:'url,omitempty'`}func (c *Cover) FromDB(bytes []byte) error { return json.Unmarshal(bytes, c)}func (c *Cover) ToDB() (bytes []byte, err error) { bytes, err = json.Marshal(c) return}具體使用:

type Course struct {Id int64 `json:'id,string' form:'id'`Name string `json:'name' form:'name'`Brief string `json:'brief' form:'brief'`Description string `json:'description' form:'description'`Cover common.Cover `xorm:'Text' json:'cover' form:'cover'`Categories common.Int64Array `xorm:'Text' json:'categories' form:'categories[]'`Tags common.Int64Array `json:'tags' form:'tags[]'`Difficulty float64 `json:'difficulty' form:'difficulty'`Price float64 `json:'price' form:'price'`Markets common.Int64Array `json:'markets' form:'markets[]'`StudentAmount int64 `json:'studentAmount' form:'studentAmount'`SubjectAmount int64 `json:'subjectAmount' form:'subjectAmount'`Crt time.Time `json:'crt'`Lut time.Time `json:'lut'`Statusint16 `json:'status' form:'status'`common.Page `xorm:'-'`}

補(bǔ)充:golang gin xorm注意事項(xiàng)

1. 無論是golang還是xorm中,在填寫j’son字段時,注意空格,比如 `json:'abcd '` `json:'abcd'`是不一樣的,不仔細(xì)對比會出錯

2.當(dāng)結(jié)合gin框中的

c.JSON(http.StatusOK,gin.H{})操作

并且使用xorm中的join,find操作時(https://www.kancloud.cn/xormplus/xorm/167102)要注意如下現(xiàn)象,

假如定義兩個結(jié)構(gòu)體對應(yīng)兩個表

在golang xorm中使用postgresql的json,array類型的操作

然后使用聯(lián)合查詢,先把兩個結(jié)構(gòu)體結(jié)合成一個結(jié)構(gòu)體,假如如下,在UserGroup中使用User和Group匿名結(jié)構(gòu)體,

在golang xorm中使用postgresql的json,array類型的操作

那么當(dāng)我們使用gin的c.JSON(http.StatusOK,gin.H{'data':UserGroup})返回數(shù)據(jù)時會導(dǎo)致Group和User中同名字段顯示不了,這應(yīng)該是gin和xorm的不是很兼容造成的(沒有深究),

要解決這個問題,最好讓UserGroup中的User和Group不要以匿名結(jié)構(gòu)體的形式存在

可以改成

type UserGroup struct { MyUser User `xorm:'extends' json:'你要json中返回的名字'` MyGroup Group `xorm:'extends' json:'你要json中返回的名字'`}

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: JavaScript
主站蜘蛛池模板: 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 无锡网站建设_企业网站定制-网站制作公司-阿凡达网络 | 金现代信息产业股份有限公司--数字化解决方案供应商 | 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 安徽成考网-安徽成人高考网 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 啤酒设备-小型啤酒设备-啤酒厂设备-济南中酿机械设备有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 汽液过滤网厂家_安平县银锐丝网有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 客服外包专业服务商_客服外包中心_网萌科技 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 展厅装修公司|企业展厅设计|展厅制作|展厅搭建—广州展厅装饰公司 | 【黄页88网】-B2B电子商务平台,b2b平台免费发布信息网 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 |