Yesql开源项目

我要开发同款
匿名用户2023年04月01日
119阅读

技术信息

开源地址
https://github.com/alimy/yesql
授权协议
BSD

作品详情

Yesql解析一个SQL文件,提取出查询语句,自动生成对应的Go结构体,实现查询语句与代码分离,方便编写数据库查询逻辑。安装gogetgithub.com/alimy/yesql使用

创建sql文件

--sqlfileyesql.sql--ame:ewest_tags@topic--getewesttagiformatioSELECTt.idid,t.user_iduser_id,t.tagtag,t.quote_umquote_um,u.id,u.ickame,u.userame,u.status,u.avatar,u.is_admiFROM@tagtJOIN@useruONt.user_id=u.idWHEREt.is_del=0ANDt.quote_um>0ORDERBYt.idDESCLIMIT?OFFSET?;--ame:hot_tags@topic--getgethosttagiformatioSELECTt.idid,t.user_iduser_id,t.tagtag,t.quote_umquote_um,u.id,u.ickame,u.userame,u.status,u.avatar,u.is_admiFROM@tagtJOIN@useruONt.user_id=u.idWHEREt.is_del=0ANDt.quote_um>0ORDERBYt.quote_umDESCLIMIT?OFFSET?;--ame:tags_by_keyword_a@topic--gettagsbykeywordSELECTid,user_id,tag,quote_umFROM@tagWHEREis_del=0ORDERBYquote_umDESCLIMIT6;--ame:tags_by_keyword_b@topicSELECTid,user_id,tag,quote_umFROM@tagWHEREis_del=0ANDtagLIKE?ORDERBYquote_umDESCLIMIT6;--ame:isert_tag@topicINSERTINTO@tag(user_id,tag,created_o,modified_o,quote_um)VALUES(?,?,?,?,1);--ame:tags_by_id_a@topic--clause:iSELECTidFROM@tagWHEREidIN(?)ANDis_del=0ANDquote_um>0;--ame:tags_by_id_b@topic--clause:iSELECTid,user_id,tag,quote_umFROM@tagWHEREidIN(?);--ame:decr_tags_by_id@topic--clause:iUPDATE@tagSETquote_um=quote_um-1,modified_o=?WHEREidIN(?);--ame:tags_for_icr@topic--clause:iSELECTid,user_id,tag,quote_umFROM@tagWHEREtagIN(?);--ame:icr_tags_by_id@topic--clause:iUPDATE@tagSETquote_um=quote_um+1,is_del=0,modified_o=?WHEREidIN(?);

使用Sca模式(方式一)

//file:topics.gopackagetopicsimport("cotext""github.com/alimy/yesql""github.com/jmoiro/sqlx")//go:embedyesql.sqlvaryesqlBytes[]bytetypeTopicstruct{yesql.Namespace`yesql:"topic"`DecrTagsByIdstrig`yesql:"decr_tags_by_id"`IcrTagsByIdstrig`yesql:"icr_tags_by_id"`TagsByIdAstrig`yesql:"tags_by_id_a"`TagsByIdBstrig`yesql:"tags_by_id_b"`TagsForIcrstrig`yesql:"tags_for_icr"`HotTags*sqlx.Stmt`yesql:"hot_tags"`IsertTag*sqlx.Stmt`yesql:"isert_tag"`NewestTags*sqlx.Stmt`yesql:"ewest_tags"`TagsByKeywordA*sqlx.Stmt`yesql:"tags_by_keyword_a"`TagsByKeywordB*sqlx.Stmt`yesql:"tags_by_keyword_b"`}fucNewTopic(db*sqlx.DB)(*Topic,error){//use*sqlx.DBaspreparecotextyesql.UseSqlx(db)//getsqlqueryquery:=yesql.MustParseBytes(yesqlBytes)//scaobjectfromsqlqueryobj:=&Topic{}iferr:=yesql.Sca(obj,query);err!=il{returil,err}returobj,il}

使用代码生成模式(方式二)

编写代码生成逻辑/file:ge.gopackagemaiimport("log""github.com/alimy/yesql")//go:geerategoru$GOFILEfucmai(){log.Pritl("[Yesql]geeratecodestart")iferr:=yesql.Geerate("yesql.sql","auto","yesql");err!=il{log.Fatalf("geeratecodeoccurserror:%s",err)}log.Pritl("[Yesql]geeratecodefiish")}自动生成Go代码%gogeeratege.go2023/03/3119:34:44[Yesql]geeratecodestart2023/03/3119:34:44[Yesql]geeratecodefiish生成代码如下(生成文件路径:auto/yesql.go)//CodegeeratedbyYesql.DONOTEDIT.//versios://-Yesqlv1.1.2packageyesqlimport("cotext""github.com/alimy/yesql""github.com/jmoiro/sqlx")cost(_TagsByKeywordB_Topic=`SELECTid,user_id,tag,quote_umFROM@tagWHEREis_del=0ANDtagLIKE?ORDERBYquote_umDESCLIMIT6`_IsertTag_Topic=`INSERTINTO@tag(user_id,tag,created_o,modified_o,quote_um)VALUES(?,?,?,?,1)`_TagsByIdA_Topic=`SELECTidFROM@tagWHEREidIN(?)ANDis_del=0ANDquote_um>0`_TagsByIdB_Topic=`SELECTid,user_id,tag,quote_umFROM@tagWHEREidIN(?)`_TagsForIcr_Topic=`SELECTid,user_id,tag,quote_umFROM@tagWHEREtagIN(?)`_IcrTagsById_Topic=`UPDATE@tagSETquote_um=quote_um+1,is_del=0,modified_o=?WHEREidIN(?)`_NewestTags_Topic=`SELECTt.idid,t.user_iduser_id,t.tagtag,t.quote_umquote_um,u.id,u.ickame,u.userame,u.status,u.avatar,u.is_admiFROM@tagtJOIN@useruONt.user_id=u.idWHEREt.is_del=0ANDt.quote_um>0ORDERBYt.idDESCLIMIT?OFFSET?`_TagsByKeywordA_Topic=`SELECTid,user_id,tag,quote_umFROM@tagWHEREis_del=0ORDERBYquote_umDESCLIMIT6`_DecrTagsById_Topic=`UPDATE@tagSETquote_um=quote_um-1,modified_o=?WHEREidIN(?)`_HotTags_Topic=`SELECTt.idid,t.user_iduser_id,t.tagtag,t.quote_umquote_um,u.id,u.ickame,u.userame,u.status,u.avatar,u.is_admiFROM@tagtJOIN@useruONt.user_id=u.idWHEREt.is_del=0ANDt.quote_um>0ORDERBYt.quote_umDESCLIMIT?OFFSET?`)typeTopicstruct{yesql.Namespace`yesql:"topic"`DecrTagsByIdstrig`yesql:"decr_tags_by_id"`IcrTagsByIdstrig`yesql:"icr_tags_by_id"`TagsByIdAstrig`yesql:"tags_by_id_a"`TagsByIdBstrig`yesql:"tags_by_id_b"`TagsForIcrstrig`yesql:"tags_for_icr"`HotTags*sqlx.Stmt`yesql:"hot_tags"`IsertTag*sqlx.Stmt`yesql:"isert_tag"`NewestTags*sqlx.Stmt`yesql:"ewest_tags"`TagsByKeywordA*sqlx.Stmt`yesql:"tags_by_keyword_a"`TagsByKeywordB*sqlx.Stmt`yesql:"tags_by_keyword_b"`}fucBuildTopic(pyesql.PreparexBuilder,ctx...cotext.Cotext)(obj*Topic,errerror){varccotext.Cotextifle(ctx)>0&&ctx[0]!=il{c=ctx[0]}else{c=cotext.Backgroud()}obj=&Topic{DecrTagsById:p.QueryHook(_DecrTagsById_Topic),IcrTagsById:p.QueryHook(_IcrTagsById_Topic),TagsByIdA:p.QueryHook(_TagsByIdA_Topic),TagsByIdB:p.QueryHook(_TagsByIdB_Topic),TagsForIcr:p.QueryHook(_TagsForIcr_Topic),}ifobj.HotTags,err=p.PreparexCotext(c,p.Rebid(p.QueryHook(_HotTags_Topic)));err!=il{retur}ifobj.IsertTag,err=p.PreparexCotext(c,p.Rebid(p.QueryHook(_IsertTag_Topic)));err!=il{retur}ifobj.NewestTags,err=p.PreparexCotext(c,p.Rebid(p.QueryHook(_NewestTags_Topic)));err!=il{retur}ifobj.TagsByKeywordA,err=p.PreparexCotext(c,p.Rebid(p.QueryHook(_TagsByKeywordA_Topic)));err!=il{retur}ifobj.TagsByKeywordB,err=p.PreparexCotext(c,p.Rebid(p.QueryHook(_TagsByKeywordB_Topic)));err!=il{retur}retur}使用 Yesql 的项目examples -项目自带examplespaopao-ce -一个清新文艺的微社区

功能介绍

Yesql 解析一个 SQL 文件,提取出查询语句,自动生成对应的 Go 结构体,实现查询语句与代码分离,方便编写数据库查询逻辑。 安装 go get github.com/alimy/yesq...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论