Guest User

Untitled

a guest
Apr 4th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "database/sql"
  5. "encoding/json"
  6. "fmt"
  7. "log"
  8. "time"
  9.  
  10. _ "github.com/lib/pq"
  11. )
  12.  
  13. type State struct {
  14. ID int
  15. Name string
  16. }
  17.  
  18. func (s State) MarshalJSON() ([]byte, error) {
  19. return json.Marshal(NewJSONState(s))
  20. }
  21.  
  22. // func (s *State) UnmarshalJSON(data []byte) error {
  23. // var js JSONState
  24. // if err := json.Unmarshal(data, &js); err != nil {
  25. // return err
  26. // }
  27. // *s = js.State()
  28. // return nil
  29. // }
  30.  
  31. type Park struct {
  32. ID int
  33. Name string
  34. Description string
  35. NearestCity string
  36. Visitors int
  37. Established time.Time
  38. StateID int
  39. State State
  40. }
  41.  
  42. func (p Park) MarshalJSON() ([]byte, error) {
  43. return json.Marshal(NewJSONPark(p))
  44. }
  45.  
  46. type JSONState struct {
  47. ID int `json:"id"`
  48. Name string `json:"name"`
  49. }
  50.  
  51. func (js JSONState) State() State {
  52. return State{
  53. js.ID,
  54. js.Name,
  55. }
  56. }
  57.  
  58. func NewJSONState(state State) JSONState {
  59. return JSONState{
  60. state.ID,
  61. state.Name,
  62. }
  63. }
  64.  
  65. type JSONPark struct {
  66. ID int `json:"id"`
  67. Name string `json:"name"`
  68. Description string `json:"description"`
  69. NearestCity string `json:"nearestCity"`
  70. Visitors int `json:"visitors"`
  71. Established time.Time `json:"establisheed"`
  72. StateID int `json:"stateID"`
  73. State State
  74. }
  75.  
  76. func NewJSONPark(park Park) JSONPark {
  77. return JSONPark{
  78. park.ID,
  79. park.Name,
  80. park.Description,
  81. park.NearestCity,
  82. park.Visitors,
  83. park.Established,
  84. park.StateID,
  85. park.State,
  86. }
  87. }
  88.  
  89. func main() {
  90.  
  91. const (
  92. host = "172.17.0.2"
  93. port = 5432
  94. user = "postgres"
  95. password = "P@ssw0rd!"
  96. dbname = "national_parks"
  97. )
  98.  
  99. connectionString := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
  100. host, port, user, password, dbname)
  101.  
  102. db, err := sql.Open("postgres", connectionString)
  103. if err != nil {
  104. log.Fatal("DB Conn error: ", err)
  105. }
  106.  
  107. if err = db.Ping(); err != nil {
  108. log.Fatal("DB Ping error: ", err)
  109. }
  110. defer db.Close()
  111. query := `
  112. Select
  113. p.id,
  114. p.name,
  115. p.description,
  116. p.nearest_city,
  117. p.visitors,
  118. p.established,
  119. p.state_id,
  120. s.id,
  121. s.name
  122. FROM parks as p
  123. LEFT OUTER JOIN states as s
  124. ON s.ID=p.state_id;`
  125.  
  126. rows, err := db.Query(query)
  127. if err != nil {
  128. log.Fatal("DB Query error: ", err)
  129. }
  130. defer rows.Close()
  131.  
  132. var parks []*Park
  133. for rows.Next() {
  134. var p = &Park{}
  135. if err := rows.Scan(
  136. &p.ID,
  137. &p.Name,
  138. &p.Description,
  139. &p.NearestCity,
  140. &p.Visitors,
  141. &p.Established,
  142. &p.StateID,
  143. &p.State.ID,
  144. &p.State.Name); err != nil {
  145. log.Fatal(err)
  146. }
  147. parks = append(parks, p)
  148. }
  149.  
  150. jsonParks, err := json.Marshal(parks)
  151. if err != nil {
  152. panic(err)
  153. }
  154. fmt.Println(string(jsonParks))
  155. }
Add Comment
Please, Sign In to add comment