城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

尝试用golang1。18泛型实现orm

5月5日 火云谷投稿
  这几天golang社区对泛型的讨论非常多的,一片热火朝天的景象。对我们广大gopher来说总归是好事。
  泛型很有可能会颠覆我们之前的很多设计,带着这种疑问和冲动,我准备尝试用golang泛型实现几个orm的常见功能。
  本文并没完全实现通用的orm,只是探讨其实现的一种方式提供各位读者做借鉴。创建Table
  虽然golang有了泛型,但是目前在标准库sql底层还没有改造,目前还有很多地方需要用到reflect。funcCreateTable〔Tany〕(dbsql。DB){varaTt:reflect。TypeOf(a)tableName:strings。ToLower(t。Name())vardescstringfori:0;it。NumField();i{columnsName:strings。ToLower(t。Field(i)。Name)varcolumnTypestringswitcht。Field(i)。Type。Kind(){casereflect。Int:columnTypeintegercasereflect。String:columnTypetext}desccolumnsNamecolumnTypeifit。NumField()1{desc,}}sqlStmt:fmt。Sprintf(createtableifnotexistss(s);,tableName,desc),err:db。Exec(sqlStmt)iferr!nil{log。Printf(q:s,err,sqlStmt)return}}
  调用方式typePersonstruct{IDintNamestringAgeint}typeStudentstruct{IDintNamestringNostring}vardbsql。DBinitdb。。。CreateTable〔Person〕(db)CreateTable〔Student〕(db)
  这个部分跟传统的orm使用上没有太大区别,没办法不使用反射的情况下,泛型的方式可能变得有点繁琐。写入数据funcCreate〔Tany〕(dbsql。DB,aT){没有办法这边还是得使用反射t:reflect。TypeOf(a)tableName:strings。ToLower(t。Name())varcolumns〔〕stringvarspacehold〔〕stringfori:0;it。NumField();i{columnsappend(columns,strings。ToLower(t。Field(i)。Name))spaceholdappend(spacehold,?)}tx,err:db。Begin()iferr!nil{log。Fatal(err)}stmt,err:tx。Prepare(fmt。Sprintf(insertintos(s)values(s),tableName,strings。Join(columns,,),strings。Join(spacehold,,)))iferr!nil{log。Fatal(err)}deferstmt。Close()v:reflect。ValueOf(a)varvalues〔〕anyfori:0;it。NumField();i{ifv。FieldByName(t。Field(i)。Name)。CanInt(){valuesappend(values,v。FieldByName(t。Field(i)。Name)。Int())}else{valuesappend(values,v。FieldByName(t。Field(i)。Name)。String())}},errstmt。Exec(values。。。)iferr!nil{panic(err)}tx。Commit()}
  调用方式varp1Person{ID:1,Name:wida,}Create〔Person〕(db,p1)vars1Student{ID:1,Name:wida,No:1111,}Create〔Person〕(db,p1)Create〔Student〕(db,s1)
  和创建table类似,写入数据好像比没有之前的orm有优势。读取数据
  读取数据是非常高频的操作,所以我们稍作封装。typeClientstruct{dbsql。DB}typeQuery〔Tany〕struct{clientClient}funcNewQuery〔Tany〕(cClient)Query〔T〕{returnQuery〔T〕{client:c,}}反射到structfuncToStruct〔Tany〕(rowssql。Rows,toT)error{v:reflect。ValueOf(to)ifv。Elem()。Type()。Kind()!reflect。Struct{returnerrors。New(Expectastruct)}scanDest:〔〕any{}columnNames,:rows。Columns()addrByColumnName:map〔string〕any{}fori:0;iv。Elem()。NumField();i{oneValue:v。Elem()。Field(i)columnName:strings。ToLower(v。Elem()。Type()。Field(i)。Name)addrByColumnName〔columnName〕oneValue。Addr()。Interface()}for,columnName:rangecolumnNames{scanDestappend(scanDest,addrByColumnName〔columnName〕)}returnrows。Scan(scanDest。。。)}func(qQuery〔T〕)FetchAll(ctxcontext。Context)(〔〕T,error){varitems〔〕TvaraTt:reflect。TypeOf(a)tableName:strings。ToLower(t。Name())rows,err:q。client。db。Query(SELECTFROMtableName)iferr!nil{returnnil,err}forrows。Next(){varcTToStruct(rows,c)itemsappend(items,c)}returnitems,nil}
  调用方式varclientClient{db:db,}{query:NewQuery〔Person〕(client)all,err:query。FetchAll(context。Background())iferr!nil{log。Fatal(err)}for,person:rangeall{log。Println(person)}}{query:NewQuery〔Student〕(client)all,err:query。FetchAll(context。Background())iferr!nil{log。Fatal(err)}for,person:rangeall{log。Println(person)}}
  稍微比原先的orm方式有了多一点想象空间,比如在〔Tany〕做更明确的约束,比如要求实现Filter定制方法。总结
  鉴于本人能力还认证有限,目前还没有发现泛型对orm剧烈的改进和突破的可能。未来如果go对底层sql做出改动,或者实现诸如Rust那种Enum方式,可能会带来更多的惊喜。
投诉 评论 转载

尝试用golang1。18泛型实现orm这几天golang社区对泛型的讨论非常多的,一片热火朝天的景象。对我们广大gopher来说总归是好事。泛型很有可能会颠覆我们之前的很多设计,带着这种疑问和冲动,我准备尝试……第一批绿牌电车开了5年,要换电池了,看到价格后,你还要买吗?导读:第一批绿牌电动车开了5年,终于要换电池了,看到电池价格后,你还要买吗?最早的绿牌车电池都该换了!不换跑不动,换了太费钱!车主:换次电池,等于白省6年油!下面就让我们一探究……618苏宁Super会员有多香超大优惠,开卡续费倒赚41元如今,会员意味着能享受诸多特别福利,传统电商平台的会员是能以更低的价格买到产品,而当苏宁易购的会员就不一样,不仅能享受更给力的直降优惠,而且还有白嫖、省钱、领红包的机会,幸福指……苹果推出搜索引擎,取代谷歌苹果正在加快其搜索引擎的研发以取代谷歌,推出自己的搜索引擎将有助于促进Apple的产品和服务的发展,并削弱Google在搜索领域的垄断地位。为了使这样的公司获利,您需要大……低价来袭!5000mAh大电池120Hz屏,8GB128GBrealme将于9月22日发布性价比手机真我GTNeo2,这款手机目前已经确认搭载骁龙870处理器,配备5000mAh大电池65W闪充。同为5000mAh大电池的realme真……别当韭菜了,谁说便宜没好货!10002000平价手机它不香吗别当韭菜了,谁说便宜没好货!10002000平价手机它不香吗?各位小白、学生党、以及想要购买平价手机的小伙伴们可以看过来了看到就是赚到,平价手机都在这里,不看后悔一辈子……华为P50系列以后能升级支持5G吗?上周四,华为P50系列发布后,最引人关注的就是只有4G版,没有5G版。但即便如此,目前预订P50系列,依然需要抢。大家争抢的原因无外乎以下几个方面:一、华为P50系列足够……关于网易云,你不知道的真相01hr网易云三宗罪随着互联网的发展,作为一个音乐软件的网易云也是越来越臃肿了从最开始加入的LOOK直播,再到短视频,因乐交友,随机匹配等等现如今这个放歌软件安装包已经达……想换机的朋友不妨再忍忍,这四款给力新机现已在路上在高端手机领域,骁龙888、骁龙870手机的出现,激发了广大消费者的购买欲望。但是现阶段的新机实在是太多了,尽管旗舰手机的数量大幅度增加,但对于消费者来说,永远是下一款新机更加……黑客称在Defi世界中,代码就是法律,同时返还数百万的Def在臭名昭著的PolyNetwork黑客攻击两天后,黑客继续向该项目汇款。8月12日,PolyNetwork黑客迄今已返还价值数百万的以太币、数千个uni代币、1,032个包装比……一千元左右最值得买的手机今天给大家推荐几款1000元左右,高刷屏,内存大处理器好,玩游戏流畅的手机!第一款realmeQ3i,999元的发布价格,作为最便宜的5G手机,6。5英寸的LCD屏,配备……知网道歉,能平息众怒吗?作者被同意交出的授权,是否具备法律效力?记者:宋宇晟为什么我创造的知识成果得不到尊重?因100多篇论文被知网擅自收录,89岁的中南财经政法大学退休教授赵德馨产……
1。PyQt5GUI软件开发框架3。PyQt5程序自定义信号目前最值得考虑的4部手机,几乎没短板,可以成为你的十三香MacM1横行,ArmWindws是否会成为主流?白天真的不用拉窗帘吗?坚果J10S投影仪2400ANSI流明vivoNEX详细测评合格但只能再独领风骚一天支付宝NFT又来了!这次你抢到了吗?论产品和口碑,一加9Pro小米11Ultra谁是5K安卓旗舰18款App被点名!速查你的手机快递行业出现罢工潮?大批快递员辞职走人,发生了什么?看了20篇评测最终我选择拿下这三款智能手环工业互联网部署又进一步万亿蓝海在前一文速览潜在受益平台名单iPhone13即将上市,说说苹果手机有哪些隐藏的功能吧
《匆匆那年》观后感天蓝微博语录心情签名精选你中招了吗为您揭秘普洱茶九大线上卖茶套准时保和准时达所代表的配送体验保障服务是否会成为怎样查最近搜过的手机微信聊天记录(微信怎样查看所有聊天记录)iOS15细节曝光锁屏UI迎全新外观还有健康功能裴长洪:当前我国宏观经济形势分析微软的FlowspacePod获得2021年红点最佳设计奖试管婴儿检查注意事项蔡梅生赴点头调研生态茶园示范园茶叶发展工作思念那一份饺子

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁