广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何使用 gocql 动态添加查询参数?
  • 902
分享到

如何使用 gocql 动态添加查询参数?

2024-04-05 00:04:55 902人浏览 八月长安
摘要

对于一个golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《如何使用 Gocql 动态添加查询参数?》,主要介绍了,希望对大家的知识积

对于一个golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《如何使用 Gocql 动态添加查询参数?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

在一个函数(golang、gocql、cassandra)中基于过滤器输入(vendor_id、customer_id、order_status_id ...或同时所有非空字段)编写查询的最佳方法是什么?我不想在每种情况下都编写新函数,例如以下仅按 customerid 过滤的函数:

func (repo *orderRepo) FindByCustomerId(req *pb.FindRequest) (*pb.OrdersResponse, error) {
    offset := req.GetOffset()
    limit := req.GetLimit()
    customerID := req.GetCustomerId()
    //vendorID := req.GetVendorId()
    //orderStatusID := req.GetOrderStatusId()
    var (
        orders []*pb.Order
        count  int32
    )
    if err := repo.session.Query(`SELECT count(1) FROM orders WHERE customer_id = ?`, customerID).
        Scan(&count); err != nil {
        return nil, err
    }
    if offset < count {
        query := repo.session.Query(`SELECT
            id,
            customer_id,
            customer_name,
            vendor_id,
            toJSON(items),
            paid_at,
            created_at,
            order_status_id
        FROM orders WHERE customer_id = ?`, customerID)
        defer query.Release()
        var ps []byte
        iter := query.PageState(ps).PageSize(int(offset % limit)).Iter()
        ps = iter.PageState()
        page := offset / limit
        var i int32
        for i = 0; i < page; i++ {
            iter = query.PageState(ps).PageSize(int(limit)).Iter()
            ps = iter.PageState()
        }
        iter = query.PageState(ps).PageSize(int(limit)).Iter()
        rows := iter.Scanner()
        for rows.Next() {
            var (
                order                pb.Order
                createdAt            time.Time
                paidAt               time.Time
                itemsjsON            []byte
            )
            if err := rows.Scan(
                &order.Id,
                &order.CustomerId,
                &order.CustomerName,
                &order.VendorId,
                &itemsJSON,
                &paidAt,
                &createdAt,
                &order.OrderStatusId,
            ); err != nil {
                return nil, err
            }
            if err := json.Unmarshal(itemsJSON, &order.Items); err != nil {
                return nil, err
            }
            order.PaidAt = paidAt.String()
            order.CreatedAt = createdAt.String()
            orders = append(orders, &order)
        }

        if err := iter.Close(); err != nil {
            return nil, err
        }
    }

    return &pb.OrdersResponse{
        Orders: orders,
        Count:  count,
    }, nil
}

我需要动态添加参数到上面的查询


解决方案


这是我在三天内提出的问题的解决方案:)我认为这会对其他人有所帮助)

func (repo *orderRepo) Find(req *pb.FindRequest) (*pb.OrdersResponse, error) {
    offset := req.GetOffset()
    limit := req.GetLimit()
    vendorID := req.GetVendorId()
    customerID := req.GetCustomerId()
    orderStatusID := req.GetOrderStatusId()

    var (
        orders []*pb.Order
        count  int32
    )

    var filter string
    var values []interface{}
    if len(vendorID) > 0 {
        if len(filter) > 0 {
            filter = filter + " AND vendor_id = ?"
        } else {
            filter = " WHERE vendor_id = ?"
        }
        values = append(values, vendorID)
    }
    if len(customerID) > 0 {
        if len(filter) > 0 {
            filter = filter + " AND customer_id = ?"
        } else {
            filter = " WHERE customer_id = ?"
        }
        values = append(values, customerID)

    }
    if len(orderStatusID) > 0 {
        if len(filter) > 0 {
            filter = filter + " AND order_status_id = ?"
        } else {
            filter = " WHERE order_status_id = ?"
        }
        values = append(values, orderStatusID)
    }

    fmt.Println(filter)

    if err := repo.session.Query(`SELECT count(1) FROM orders`+filter, values...).
        Scan(&count); err != nil {
        return nil, err
    }

    if offset < count {
        query := repo.session.Query(`SELECT
        id,
        customer_id,
        customer_name,
        vendor_id,
        toJSON(items),
        paid_at,
        created_at,
        order_status_id
        FROM orders`+filter, values...)
        defer query.Release()

        var ps []byte
        iter := query.PageState(ps).PageSize(int(offset % limit)).Iter()
        ps = iter.PageState()

        page := offset / limit
        var i int32
        for i = 0; i < page; i++ {
            iter = query.PageState(ps).PageSize(int(limit)).Iter()
            ps = iter.PageState()
        }
        iter = query.PageState(ps).PageSize(int(limit)).Iter()

        rows := iter.Scanner()
        for rows.Next() {
            var (
                order                pb.Order
                createdAt            time.Time
                paidAt               time.Time
                itemsJSON            []byte
            )
            if err := rows.Scan(
                &order.Id,
                &order.CustomerId,
                &order.CustomerName,
                &order.VendorId,
                &itemsJSON,
                &paidAt,
                &createdAt,
                &order.OrderStatusId,
            ); err != nil {
                return nil, err
            }
            if err := json.Unmarshal(itemsJSON, &order.Items); err != nil {
                return nil, err
            }
            order.PaidAt = paidAt.String()
            order.CreatedAt = createdAt.String()
            orders = append(orders, &order)
        }

        if err := iter.Close(); err != nil {
            return nil, err
        }
    }

    return &pb.OrdersResponse{
        Orders: orders,
        Count:  count,
    }, nil
}

终于介绍完啦!小伙伴们,这篇关于《如何使用 gocql 动态添加查询参数?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用 gocql 动态添加查询参数?

本文链接: https://www.lsjlt.com/news/596814.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linq动态条件查询如何使用
    本篇内容主要讲解“linq动态条件查询如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linq动态条件查询如何使用”吧!1,linq动态条件之构造表达式树private Expr...
    99+
    2023-06-17
  • 如何使用RequestHeaders添加自定义参数
    目录RequestHeaders添加自定义参数问题一原因解决方案修改request中header的值RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到r...
    99+
    2022-11-13
  • 使用ajax怎么动态查询数据库数据
    今天就跟大家聊聊有关使用ajax怎么动态查询数据库数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Controller层查询总用户数 @RequestMapping(va...
    99+
    2023-06-08
  • 如何使用Python Celery动态添加定时任务
    本篇内容介绍了“如何使用Python Celery动态添加定时任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、背景实际工作中...
    99+
    2023-07-06
  • Mysql 使用存储过程动态批量添加数据
    循环批量插入数据 -- 创建存储过程 create procedure my_procedure01(in num int(2),out ii int(2)) begin declare i int(2) defaul...
    99+
    2021-05-18
    Mysql 使用存储过程动态批量添加数据
  • 使用JPA+querydsl如何实现多条件动态查询
    目录JPAquerydsl多条件动态查询介绍一下querydsl看源码springdataJPA和querydsl什么是SpringDataJPA?什么是QueryDSL?@Mapp...
    99+
    2022-11-13
  • Android中如何使用TagFlowLayout制作动态添加删除标签
    这篇文章给大家分享的是有关Android中如何使用TagFlowLayout制作动态添加删除标签的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图简单的效果图(使用开源库)[FlowLayout](“ http...
    99+
    2023-05-30
    android tagflowlayout
  • 如何使用PHP查询HTTP状态码
    这篇文章主要讲解了“如何使用PHP查询HTTP状态码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用PHP查询HTTP状态码”吧!第一步:使用PHP构建HTTP请求要查询HTTP状态码...
    99+
    2023-07-05
  • 小程序开发如何添加节点的滚动位置查询请求
    本文小编为大家详细介绍“小程序开发如何添加节点的滚动位置查询请求”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序开发如何添加节点的滚动位置查询请求”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。添加节点的滚动...
    99+
    2023-06-26
  • 大数据报表中如何添加动态文字水印
    大数据报表中如何添加动态文字水印,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。水印是把一些标识信息嵌入到信息载体中,在不影响原载体内容使用的同时,为原作者提供识...
    99+
    2023-06-04
  • springdata jpa如何使用Example快速实现动态查询功能
    这篇文章将为大家详细讲解有关springdata jpa如何使用Example快速实现动态查询功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Example官方介绍Query by Example (Q...
    99+
    2023-06-25
  • 如何用css3制作按钮并添加动态效果
    本篇内容主要讲解“如何用css3制作按钮并添加动态效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用css3制作按钮并添加动态效果”吧! ...
    99+
    2022-10-19
  • 使用jQuery怎么实时保存页面动态添加的数据
    使用jQuery怎么实时保存页面动态添加的数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实际情况:用户填写的表单,是通过 JavaScri...
    99+
    2022-10-19
  • 使用python在es中基本操作详解(添加索引、查询索引、删除索引、判断索引是否存在、添加数据、更新数据、查询数据)
    1.添加索引 示例代码1: from elasticsearch import Elasticsearches = Elasticsearch(hosts='http://127.0.0.1:9200')# print(es)doc = {...
    99+
    2023-09-14
    elasticsearch python
  • JS中如何使用localStorage防止页面动态添加数据刷新后数据丢失
    这篇文章主要为大家展示了“JS中如何使用localStorage防止页面动态添加数据刷新后数据丢失”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中如何使用l...
    99+
    2022-10-19
  • 利用Mybatis如何实现模糊查询、批量添加等功能
    利用Mybatis如何实现模糊查询、批量添加等功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。模糊查询:@Select({ "SELECT * ...
    99+
    2023-05-31
    mybatis 模糊查询
  • 如何利用js给datalist或select动态添加option选项
    这篇文章给大家分享的是有关如何利用js给datalist或select动态添加option选项的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。有时需要从配置文件中读取信息,然后添加...
    99+
    2022-10-19
  • 如何用Vue.js实现动态添加、删除选题功能
    这篇“如何用Vue.js实现动态添加、删除选题功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用Vue.js实现动态添...
    99+
    2023-07-04
  • elementUI如何动态给el-tree添加子节点数据children详解
    目录一、需求二、实现1. tree 的实例事件 node-click2. tree 的实例方法:updateKeyChildren3. 自动展示当前被点击的节点4. 页面重...
    99+
    2022-11-16
    element tree 添加子节点 element el-tree elementui el-tree
  • web端展现报表时查询表单如何实现参数联动
    web端展现报表时查询表单如何实现参数联动,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。web 端查询表单中多个参数级联查询是查询控件之间一种常见的互动方式,前...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作