Advertisement
Guest User

Untitled

a guest
Mar 7th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. package pg_test
  2.  
  3. import (
  4. "fmt"
  5. "reflect"
  6. "time"
  7.  
  8. "gopkg.in/pg.v4"
  9. "gopkg.in/pg.v4/orm"
  10. "gopkg.in/pg.v4/types"
  11. )
  12.  
  13. type User struct {
  14. Id int64
  15. Name string
  16. Emails []string
  17. CreatedAt time.Time
  18. }
  19.  
  20. func (u User) String() string {
  21. return fmt.Sprintf("User<%d %s %v>", u.Id, u.Name, u.Emails)
  22. }
  23.  
  24. type Story struct {
  25. Id int64
  26. Title string
  27. UserId int64
  28. User *User
  29. }
  30.  
  31. func (s Story) String() string {
  32. return fmt.Sprintf("Story<%d %s %s>", s.Id, s.Title, s.User)
  33. }
  34.  
  35. func createSchema(db *pg.DB) error {
  36. queries := []string{
  37. `CREATE TEMP TABLE users (id serial, name text, emails jsonb, created_at timestamp)`,
  38. `CREATE TEMP TABLE stories (id serial, title text, user_id bigint)`,
  39. }
  40. for _, q := range queries {
  41. _, err := db.Exec(q)
  42. if err != nil {
  43. return err
  44. }
  45. }
  46. return nil
  47. }
  48.  
  49. func MyCreate(db *pg.DB, v interface{}) error {
  50. model, err := orm.NewTableModel(v)
  51. if err != nil {
  52. return err
  53. }
  54. _, err = db.Query(model, insert{TableModel: model})
  55. return err
  56. }
  57.  
  58. type insert struct {
  59. *orm.TableModel
  60. }
  61.  
  62. func (ins insert) AppendQuery(b []byte, params ...interface{}) ([]byte, error) {
  63. strct := ins.Value()
  64.  
  65. b = append(b, "INSERT INTO "...)
  66. b = types.AppendField(b, ins.Table.Name, true)
  67.  
  68. b = append(b, " ("...)
  69. for i, field := range ins.Table.Fields {
  70. if field.Has(orm.PrimaryKeyFlag) && field.IsEmpty(strct) {
  71. continue
  72. }
  73. b = types.AppendField(b, field.SQLName, true)
  74. if i != len(ins.Table.Fields)-1 {
  75. b = append(b, ", "...)
  76. }
  77. }
  78.  
  79. b = append(b, ") VALUES ("...)
  80.  
  81. for i, field := range ins.Table.Fields {
  82. if field.Has(orm.PrimaryKeyFlag) && field.IsEmpty(strct) {
  83. continue
  84. }
  85. b = field.AppendValue(b, strct, true)
  86. if i != len(ins.Table.Fields)-1 {
  87. b = append(b, ", "...)
  88. }
  89. }
  90. b = append(b, ")"...)
  91.  
  92. var fs []*orm.Field
  93. fs = append(fs, ins.Table.PKs...)
  94. for _, field := range ins.Table.Fields {
  95. if field.SQLName == "created_at" || field.SQLName == "updated_at" {
  96. fs = append(fs, field)
  97. }
  98. }
  99. b = appendReturning(b, strct, fs)
  100. return b, nil
  101. }
  102.  
  103. func appendReturning(b []byte, v reflect.Value, fields []*orm.Field) []byte {
  104. var hasReturning bool
  105. for i, f := range fields {
  106. if !f.IsEmpty(v) {
  107. //continue
  108. }
  109. if !hasReturning {
  110. b = append(b, " RETURNING "...)
  111. hasReturning = true
  112. }
  113. b = types.AppendField(b, f.SQLName, true)
  114. if i != len(fields)-1 {
  115. b = append(b, ", "...)
  116. }
  117. }
  118. return b
  119. }
  120.  
  121. func ExampleDB_Query() {
  122. db := pg.Connect(&pg.Options{
  123. User: "relax",
  124. Password: "relax",
  125. Database: "relaxdb-test",
  126. })
  127.  
  128. err := createSchema(db)
  129. if err != nil {
  130. panic(err)
  131. }
  132.  
  133. user1 := &User{
  134. Name: "admin",
  135. Emails: []string{"admin1@admin", "admin2@admin"},
  136. }
  137. err = MyCreate(db, user1)
  138. if err != nil {
  139. panic(err)
  140. }
  141.  
  142. err = db.Create(&User{
  143. Name: "root",
  144. Emails: []string{"root1@root", "root2@root"},
  145. })
  146. if err != nil {
  147. panic(err)
  148. }
  149.  
  150. story1 := &Story{
  151. Title: "Cool story",
  152. UserId: user1.Id,
  153. }
  154. err = db.Create(story1)
  155.  
  156. var user User
  157. err = db.Model(&user).Where("id = ?", user1.Id).Select()
  158. if err != nil {
  159. panic(err)
  160. }
  161.  
  162. var users []User
  163. err = db.Model(&users).Select()
  164. if err != nil {
  165. panic(err)
  166. }
  167.  
  168. var story Story
  169. err = db.Model(&story).
  170. Columns("story.*", "User").
  171. Where("story.id = ?", story1.Id).
  172. Select()
  173. if err != nil {
  174. panic(err)
  175. }
  176.  
  177. fmt.Println(user)
  178. fmt.Println(users[0], users[1])
  179. fmt.Println(story)
  180. // Output: User<1 admin [admin1@admin admin2@admin]>
  181. // User<1 admin [admin1@admin admin2@admin]> User<2 root [root1@root root2@root]>
  182. // Story<1 Cool story User<1 admin [admin1@admin admin2@admin]>>
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement