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 -一个清新文艺的微社区
评论