gorm query with struct
package main
import (
"fmt""github.com/alingse/structquery""gorm.io/gorm"
)
// DB ----------------------------------------------------------typeUserModelstruct {
gorm.ModelNamestring`json:"name"`Emailstring`json:"email"`
}
func (uUserModel) TableName() string {
return"users"
}
varDB=initGormDB()
varqueryer=structquery.NewQueryer()
typeUserModelQuerystruct {
Namestring`sq:"like"`Emailstring`sq:"eq"`
}
funcmain() {
varq=UserModelQuery{
Name: "hello",
Email: "a@b",
}
db:=DB.Model(&User{})
sql:=db.ToSQL(func(tx*gorm.DB) *gorm.DB {
varusers []Usertx, _=queryer.Where(tx, q)
returntx.Find(&users)
})
// SELECT * FROM `users` WHERE (`name` LIKE "%hello%" AND `email` = "a@b")fmt.Println(sql)
}package tests_test
import (
"encoding/json""net/http""github.com/alingse/structquery""github.com/gorilla/schema""gorm.io/gorm"
)
// DB -------------------------------------------------------------------------varGormDB*gorm.DBtypeUserModelstruct {
gorm.ModelNamestring`json:"name"`Emailstring`json:"email"`
}
func (uUserModel) TableName() string {
return"users"
}
// HTTP -----------------------------------------------------------------------varqueryDecoder=schema.NewDecoder()
funcinit() {
queryDecoder.IgnoreUnknownKeys(true)
queryDecoder.SetAliasTag("json")
}
// Query ----------------------------------------------------------------------typeUserQuerystruct {
Namestring`json:"name" sq:"like"`Emailstring`json:"email" sq:"eq"`
}
varstructQueryer=structquery.NewQueryer()
funcGetUsers(w http.ResponseWriter, r*http.Request) {
varqueryUserQuery// decode from URLerr:=queryDecoder.Decode(&query, r.URL.Query())
iferr!=nil {
w.WriteHeader(http.StatusBadRequest)
return
}
db:=GormDB.Model(&UserModel{})
// bind queryerdb, err=structQueryer.Where(db, query)
iferr!=nil {
w.WriteHeader(http.StatusBadRequest)
return
}
varusers []UserModeldb.Find(&users)
w.WriteHeader(http.StatusOK)
_=json.NewEncoder(w).Encode(users)
}- support and/or with slice?
- add structQueryer.Parse return with interface
- more db test