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

enyaitl3  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(483)

基于过滤器输入(供应商标识、客户标识、订单状态标识)编写查询的最佳方式是什么。。。或所有的非空字段(同时)在一个函数中(golang、gocql、cassandra)?我不想在任何情况下都编写新函数,比如下面的函数,它只按customerid过滤:

  1. func (repo *orderRepo) FindByCustomerId(req *pb.FindRequest) (*pb.OrdersResponse, error) {
  2. offset := req.GetOffset()
  3. limit := req.GetLimit()
  4. customerID := req.GetCustomerId()
  5. //vendorID := req.GetVendorId()
  6. //orderStatusID := req.GetOrderStatusId()
  7. var (
  8. orders []*pb.Order
  9. count int32
  10. )
  11. if err := repo.session.Query(`SELECT count(1) FROM orders WHERE customer_id = ?`, customerID).
  12. Scan(&count); err != nil {
  13. return nil, err
  14. }
  15. if offset < count {
  16. query := repo.session.Query(`SELECT
  17. id,
  18. customer_id,
  19. customer_name,
  20. vendor_id,
  21. toJSON(items),
  22. paid_at,
  23. created_at,
  24. order_status_id
  25. FROM orders WHERE customer_id = ?`, customerID)
  26. defer query.Release()
  27. var ps []byte
  28. iter := query.PageState(ps).PageSize(int(offset % limit)).Iter()
  29. ps = iter.PageState()
  30. page := offset / limit
  31. var i int32
  32. for i = 0; i < page; i++ {
  33. iter = query.PageState(ps).PageSize(int(limit)).Iter()
  34. ps = iter.PageState()
  35. }
  36. iter = query.PageState(ps).PageSize(int(limit)).Iter()
  37. rows := iter.Scanner()
  38. for rows.Next() {
  39. var (
  40. order pb.Order
  41. createdAt time.Time
  42. paidAt time.Time
  43. itemsJSON []byte
  44. )
  45. if err := rows.Scan(
  46. &order.Id,
  47. &order.CustomerId,
  48. &order.CustomerName,
  49. &order.VendorId,
  50. &itemsJSON,
  51. &paidAt,
  52. &createdAt,
  53. &order.OrderStatusId,
  54. ); err != nil {
  55. return nil, err
  56. }
  57. if err := json.Unmarshal(itemsJSON, &order.Items); err != nil {
  58. return nil, err
  59. }
  60. order.PaidAt = paidAt.String()
  61. order.CreatedAt = createdAt.String()
  62. orders = append(orders, &order)
  63. }
  64. if err := iter.Close(); err != nil {
  65. return nil, err
  66. }
  67. }
  68. return &pb.OrdersResponse{
  69. Orders: orders,
  70. Count: count,
  71. }, nil
  72. }

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

kmynzznz

kmynzznz1#

以下是我对自己在3天内提出的问题的解答:)我认为这会帮助其他人)

  1. func (repo *orderRepo) Find(req *pb.FindRequest) (*pb.OrdersResponse, error) {
  2. offset := req.GetOffset()
  3. limit := req.GetLimit()
  4. vendorID := req.GetVendorId()
  5. customerID := req.GetCustomerId()
  6. orderStatusID := req.GetOrderStatusId()
  7. var (
  8. orders []*pb.Order
  9. count int32
  10. )
  11. var filter string
  12. var values []interface{}
  13. if len(vendorID) > 0 {
  14. if len(filter) > 0 {
  15. filter = filter + " AND vendor_id = ?"
  16. } else {
  17. filter = " WHERE vendor_id = ?"
  18. }
  19. values = append(values, vendorID)
  20. }
  21. if len(customerID) > 0 {
  22. if len(filter) > 0 {
  23. filter = filter + " AND customer_id = ?"
  24. } else {
  25. filter = " WHERE customer_id = ?"
  26. }
  27. values = append(values, customerID)
  28. }
  29. if len(orderStatusID) > 0 {
  30. if len(filter) > 0 {
  31. filter = filter + " AND order_status_id = ?"
  32. } else {
  33. filter = " WHERE order_status_id = ?"
  34. }
  35. values = append(values, orderStatusID)
  36. }
  37. fmt.Println(filter)
  38. if err := repo.session.Query(`SELECT count(1) FROM orders`+filter, values...).
  39. Scan(&count); err != nil {
  40. return nil, err
  41. }
  42. if offset < count {
  43. query := repo.session.Query(`SELECT
  44. id,
  45. customer_id,
  46. customer_name,
  47. vendor_id,
  48. toJSON(items),
  49. paid_at,
  50. created_at,
  51. order_status_id
  52. FROM orders`+filter, values...)
  53. defer query.Release()
  54. var ps []byte
  55. iter := query.PageState(ps).PageSize(int(offset % limit)).Iter()
  56. ps = iter.PageState()
  57. page := offset / limit
  58. var i int32
  59. for i = 0; i < page; i++ {
  60. iter = query.PageState(ps).PageSize(int(limit)).Iter()
  61. ps = iter.PageState()
  62. }
  63. iter = query.PageState(ps).PageSize(int(limit)).Iter()
  64. rows := iter.Scanner()
  65. for rows.Next() {
  66. var (
  67. order pb.Order
  68. createdAt time.Time
  69. paidAt time.Time
  70. itemsJSON []byte
  71. )
  72. if err := rows.Scan(
  73. &order.Id,
  74. &order.CustomerId,
  75. &order.CustomerName,
  76. &order.VendorId,
  77. &itemsJSON,
  78. &paidAt,
  79. &createdAt,
  80. &order.OrderStatusId,
  81. ); err != nil {
  82. return nil, err
  83. }
  84. if err := json.Unmarshal(itemsJSON, &order.Items); err != nil {
  85. return nil, err
  86. }
  87. order.PaidAt = paidAt.String()
  88. order.CreatedAt = createdAt.String()
  89. orders = append(orders, &order)
  90. }
  91. if err := iter.Close(); err != nil {
  92. return nil, err
  93. }
  94. }
  95. return &pb.OrdersResponse{
  96. Orders: orders,
  97. Count: count,
  98. }, nil
  99. }
展开查看全部

相关问题