前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >造一个轮子:sqlc支持mysql in 语法

造一个轮子:sqlc支持mysql in 语法

作者头像
golangLeetcode
发布2022-08-02 19:04:34
3050
发布2022-08-02 19:04:34
举报

sqlc可以根据我们编写的 SQL 语句生成类型安全的、地道的 Go 接口代码,我们要做的只是调用这些方法。但是sqlc 不支持in 语法,写代码比较痛苦,所以对sqlc进行了修改,添加了in语法支持的功能。

项目地址:

源码:https://github.com/xiazemin/sqlc

实例:https://github.com/xiazemin/sqlc_study

安装

代码语言:javascript
复制
go get -u github.com/xiazemin/sqlc

使用

https://github.com/kyleconroy/sqlc 的sql 是没法解析in操作的

本文实现的sqlc 支持复杂的in 操作比如

代码语言:javascript
复制
-- name: GetOneAuthor :one
SELECT * FROM authors where  id in (?)  and bio=? and  name in (?)  limit 1;

生成的相关代码如下

代码语言:javascript
复制

const getOneAuthor = `-- name: GetOneAuthor :one
SELECT id, name, bio FROM authors where  id in (?)  and bio=? and  name in (?)  limit 1
`

type GetOneAuthorParams struct {
  ID []int32

  Bio sql.NullString

  Name []string
}

func stringSlice2interface(l []string) []interface{} {
  v := make([]interface{}, len(l))
  for i, val := range l {
    v[i] = val

  }
  return v
}

func (q *Queries) GetOneAuthor(ctx context.Context, arg GetOneAuthorParams) (Author, error) {

  getOneAuthor := getOneAuthor

  {
    param := "?"
    for i := 0; i < len(arg.ID)-1; i++ {
      param += ",?"
    }
    getOneAuthor = replaceNth(getOneAuthor, "(?)", "("+param+")", 1)
  }

  {
    param := "?"
    for i := 0; i < len(arg.Name)-1; i++ {
      param += ",?"
    }
    getOneAuthor = replaceNth(getOneAuthor, "(?)", "("+param+")", 1)
  }

  row := q.db.QueryRowContext(ctx, getOneAuthor, append(append(int32Slice2interface(arg.ID), arg.Bio), stringSlice2interface(arg.Name)...)...)
  var i Author
  err := row.Scan(&i.ID, &i.Name, &i.Bio)
  return i, err
}

完全兼容以前的sqlc,一键生成支持in 语法的代码,不用手动维护

注意,对于子查询暂时不支持

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档