Advertisement
Guest User

Untitled

a guest
Apr 1st, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "errors"
  6. "database/sql/driver"
  7. "fmt"
  8. "github.com/jmoiron/sqlx"
  9. _ "github.com/lib/pq"
  10. "log"
  11. )
  12.  
  13. var schema = `
  14. CREATE TABLE person (
  15. first_name text,
  16. last_name text,
  17. contact JSON
  18. );`
  19.  
  20. type PersonContact map[string]interface{};
  21.  
  22. func (pc *PersonContact) Scan(val interface{}) error {
  23. switch v := val.(type){
  24. case []byte:
  25. json.Unmarshal(v, &pc)
  26. return nil
  27. case string:
  28. json.Unmarshal([]byte(v), &pc)
  29. return nil
  30. default:
  31. return errors.New(fmt.Sprintf("Unsupported type: %T", v))
  32. }
  33. }
  34. func (pc *PersonContact) Value() (driver.Value, error) {
  35. return json.Marshal(pc)
  36. }
  37.  
  38.  
  39. type Person struct {
  40. FirstName string `db:"first_name"`
  41. LastName string `db:"last_name"`
  42. Contact PersonContact `db:"contact"`
  43. }
  44.  
  45. func main() {
  46. db, err := sqlx.Connect("postgres", "user=test dbname=test password=test")
  47. if err != nil {
  48. log.Fatalln(err)
  49. }
  50. defer db.Close()
  51.  
  52. // exec the schema or fail
  53. db.MustExec("DROP TABLE IF EXISTS person;")
  54. db.MustExec(schema)
  55.  
  56. var person Person
  57. contact := map[string]string{"email": "jmoiron@jmoiron.net"}
  58. contact_json, _ := json.Marshal(contact)
  59.  
  60. db.MustExec("INSERT INTO person (first_name, last_name, contact) VALUES ($1, $2, $3)", "Jason", "Moiron", contact_json)
  61.  
  62. row := db.QueryRowx("SELECT first_name, last_name, contact FROM person LIMIT 1")
  63. err = row.StructScan(&person)
  64. if err != nil {
  65. panic(err)
  66. }
  67. fmt.Printf("=> %v\n", person)
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement