name: Raw SQL to query

sort: 5

Raw SQL to query

  • Using Raw SQL to query doesn’t require an ORM definition
  • Multiple databases support ? as placeholders and auto convert.
  • The params of query support Model Struct, Slice and Array
  1. ids := []int{1, 2, 3}
  2. p.Raw("SELECT name FROM user WHERE id IN (?, ?, ?)", ids)

Create a RawSeter

  1. o := NewOrm()
  2. var r RawSeter
  3. r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
  1. // RawSeter raw query seter
  2. // create From Ormer.Raw
  3. // for example:
  4. // sql := fmt.Sprintf("SELECT %sid%s,%sname%s FROM %suser%s WHERE id = ?",Q,Q,Q,Q,Q,Q)
  5. // rs := Ormer.Raw(sql, 1)
  6. type RawSeter interface {
  7. // execute sql and get result
  8. Exec() (sql.Result, error)
  9. // query data and map to container
  10. // for example:
  11. // var name string
  12. // var id int
  13. // rs.QueryRow(&id,&name) // id==2 name=="slene"
  14. QueryRow(containers ...interface{}) error
  15. // query data rows and map to container
  16. // var ids []int
  17. // var names []int
  18. // query = fmt.Sprintf("SELECT 'id','name' FROM %suser%s", Q, Q)
  19. // num, err = dORM.Raw(query).QueryRows(&ids,&names) // ids=>{1,2},names=>{"nobody","slene"}
  20. QueryRows(containers ...interface{}) (int64, error)
  21. SetArgs(...interface{}) RawSeter
  22. // query data to []map[string]interface
  23. // see QuerySeter's Values
  24. Values(container *[]Params, cols ...string) (int64, error)
  25. // query data to [][]interface
  26. // see QuerySeter's ValuesList
  27. ValuesList(container *[]ParamsList, cols ...string) (int64, error)
  28. // query data to []interface
  29. // see QuerySeter's ValuesFlat
  30. ValuesFlat(container *ParamsList, cols ...string) (int64, error)
  31. // query all rows into map[string]interface with specify key and value column name.
  32. // keyCol = "name", valueCol = "value"
  33. // table data
  34. // name | value
  35. // total | 100
  36. // found | 200
  37. // to map[string]interface{}{
  38. // "total": 100,
  39. // "found": 200,
  40. // }
  41. RowsToMap(result *Params, keyCol, valueCol string) (int64, error)
  42. // query all rows into struct with specify key and value column name.
  43. // keyCol = "name", valueCol = "value"
  44. // table data
  45. // name | value
  46. // total | 100
  47. // found | 200
  48. // to struct {
  49. // Total int
  50. // Found int
  51. // }
  52. RowsToStruct(ptrStruct interface{}, keyCol, valueCol string) (int64, error)
  53. // return prepared raw statement for used in times.
  54. // for example:
  55. // pre, err := dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare()
  56. // r, err := pre.Exec("name1") // INSERT INTO tag (name) VALUES (`name1`)
  57. Prepare() (RawPreparer, error)
  58. }

Exec

Run sql query and return sql.Result object

  1. res, err := o.Raw("UPDATE user SET name = ?", "your").Exec()
  2. if err == nil {
  3. num, _ := res.RowsAffected()
  4. fmt.Println("mysql row affected nums: ", num)
  5. }

QueryRow

QueryRow and QueryRows support high-level sql mapper.

Supports struct:

  1. type User struct {
  2. Id int
  3. Name string
  4. }
  5. var user User
  6. err := o.Raw("SELECT id, name FROM user WHERE id = ?", 1).QueryRow(&user)

from Beego 1.1.0 remove multiple struct support ISSUE 384

QueryRows

QueryRows supports the same mapping rules as QueryRow but all of them are slice.

  1. type User struct {
  2. Id int
  3. Name string
  4. }
  5. var users []User
  6. num, err := o.Raw("SELECT id, name FROM user WHERE id = ?", 1).QueryRows(&users)
  7. if err == nil {
  8. fmt.Println("user nums: ", num)
  9. }

from Beego 1.1.0 remove multiple struct support ISSUE 384

SetArgs

Changing args param in Raw(sql, args…) can return a new RawSeter.

It can reuse the same SQL query but different params.

  1. res, err := r.SetArgs("arg1", "arg2").Exec()
  2. res, err := r.SetArgs("arg1", "arg2").Exec()
  3. ...

Values / ValuesList / ValuesFlat

The resultSet values returned by Raw SQL query are string. NULL field will return empty string ``

from Beego 1.1.0 Values, ValuesList, ValuesFlat. The returned fields can be specified. Generally you don’t need to specify. Because the field names are already defined in your SQL.

Values

The key => value pairs of resultSet:

  1. var maps []orm.Params
  2. num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).Values(&maps)
  3. if err == nil && num > 0 {
  4. fmt.Println(maps[0]["user_name"]) // slene
  5. }

ValuesList

slice of resultSet

  1. var lists []orm.ParamsList
  2. num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).ValuesList(&lists)
  3. if err == nil && num > 0 {
  4. fmt.Println(lists[0][0]) // slene
  5. }

ValuesFlat

Return slice of a single field:

  1. var list orm.ParamsList
  2. num, err := o.Raw("SELECT id FROM user WHERE id < ?", 10).ValuesFlat(&list)
  3. if err == nil && num > 0 {
  4. fmt.Println(list) // []{"1","2","3",...}
  5. }

RowsToMap

SQL query results

name value
total 100
found 200

map rows results to map

  1. res := make(orm.Params)
  2. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToMap(&res, "name", "value")
  3. // res is a map[string]interface{}{
  4. // "total": 100,
  5. // "found": 200,
  6. // }

RowsToStruct

SQL query results

name value
total 100
found 200

map rows results to struct

  1. type Options struct {
  2. Total int
  3. Found int
  4. }
  5. res := new(Options)
  6. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToStruct(res, "name", "value")
  7. fmt.Println(res.Total) // 100
  8. fmt.Println(res.Found) // 200

support name conversion: snake -> camel, eg: SELECT user_name … to your struct field UserName.

Prepare

Prepare once and exec multiple times to improve the speed of batch execution.

  1. p, err := o.Raw("UPDATE user SET name = ? WHERE name = ?").Prepare()
  2. res, err := p.Exec("testing", "slene")
  3. res, err = p.Exec("testing", "astaxie")
  4. ...
  5. ...
  6. p.Close() // Don't forget to close the prepare.