项目作者: josuebrunel

项目描述 :
Turn your url query string into sql where clause
高级语言: Go
项目地址: git://github.com/josuebrunel/clausify.git
创建时间: 2021-01-03T17:55:46Z
项目社区:https://github.com/josuebrunel/clausify

开源协议:MIT License

下载


test
coverage
goreportcard
gopkg
license

Clausify

Clausify helps you turn you url query strings into SQL Where clause
It supports SQL Comparison operators and some logical operators

Installation

  1. go get github.com/josuebrunel/clausify

Quickstart

  1. import (
  2. "github.com/josuebrunel/clausify"
  3. "net/url"
  4. "fmt"
  5. )
  6. u, _ := url.Parse("https://httpbin.org/?email__like=@toto.com&age__gte=24&company=toto")
  7. c, err := clausify.Clausify(u.Query())
  8. if err != nil {
  9. // do whatever
  10. }
  11. fmt.Printf("%s\n", c.Conditions) // email like '?' AND age >= ? AND company = '?'
  12. fmt.Printf("%v\n", c.Variables) // ["@toto.com", 24, "toto"]

Supported operators by the operators.DefaultOperator

Query string filters SQL Operators
element=value element = value OR element = ‘value’
element__neq=value element != value OR element != ‘value’
element__gt=value element > value
element__gte=value element >= value
element__lt=value element < value
element__lte=value element <= value
element__like=value element LIKE ‘value’
element__ilike=value element ILIKE ‘value’
element__nlike=value element NOT LIKE ‘value’
element__in=value1,value2,valueN element IN (value1, value2, valueN)
element__nin=value1,value2,valueN element NOT IN (value1, value2, valueN)
element__between=left,right element BETWEEN left AND right
element__nbetween=left,right element NOT BETWEEN left AND right

GORM Example

  1. c, _ = clausify.Clausify(u.Query())
  2. db.Where(c.Conditions, c.Variables...).Find(&p)

Implement a custom Operator

Use a struct implementing Clausifier interface with Clausify method as below

  1. import (
  2. "github.com/josuebrunel/clausify"
  3. "net/url"
  4. "strings"
  5. "testing"
  6. "errors"
  7. )
  8. type MyClausifier struct {
  9. Separator string
  10. }
  11. func (m MyClausifier) Clausify(k string, vv []string) (clause.Condition, error) {
  12. op := strings.Split(k, m.Separator)
  13. if op[1] == "<>" {
  14. return clause.Condition{
  15. Expression: clause.Concat(op[0], " <> ?"),
  16. Variables: []interface{}{vv[0]},
  17. }, nil
  18. }
  19. return clause.Condition{}, errors.New("Invalid operator")
  20. }
  21. u, _ := url.Parse("https://httpbin.org/?id-<>=1")
  22. q := u.Query()
  23. c, _ := clausify.With(q, MyClausifier{Separator: "-"})
  24. is.True(strings.Contains(c.Conditions, "id <> ?"))
  25. is.Equal(len(c.Variables), 1)