xorm-Iterate/Count/Rows方法实例
阅读原文时间:2023年07月13日阅读:1
  package main

  import (
     "fmt"
     _ "github.com/go-sql-driver/mysql"
     "github.com/go-xorm/xorm"
     "log"
     "time"
  )

  var engine *xorm.Engine

  type User struct {
     Name      string    `xorm:"varchar(25) 'name'"`
     Id        int       `xorm:"pk 'id' autoincr"`
     Money     int       `xorm:" 'money' "`
     Age       int       `xorm:"age"`
     CreatedAt time.Time `xorm:"created"`
  }

  func main() {
     var err error
     engine, err = xorm.NewEngine("mysql", "root:123456@/test")
     if err != nil {
        log.Fatal(err)
        return
     }
     //创建表和插入数据
     /* err = engine.CreateTables(User{})
        if err != nil {
           log.Fatal(err)
           return
        }

        u := make([]User, 3)
        u[0].Name = "u0"
        u[0].Money = 1
        u[0].Age = 1
        u[1].Name = "u1"
        u[1].Money = 2
        u[1].Age = 1
        u[2].Name = "u2"
        u[2].Money = 3
        u[2].Age = 1

        _, err = engine.Insert(u)
        if err != nil {
           log.Fatal(err)
           return
        }*/

     /*
        Iterate方法提供逐条执行查询到的记录的方法,他所能使用的条件和Find方法完全相同
        err := engine.Where("age > ? or name=?)", 30, "xlw").Iterate(new(Userinfo), func(i int, bean interface{})error{
           user := bean.(*Userinfo)
           //do somthing use i and user
        })*/

     err = engine.Where("id>?", 0).Iterate(new(User), func(i int, bean interface{}) error {
        user := bean.(*User)
        fmt.Println("Iterate方法所有id>0的人的名字为:", user.Name)
        return err
     })

     /* func(i int, bean interface{}) error {
           user := bean.(*User)
           fmt.Println("Iterate方法所有id>0的人的名字为:", user.Name)
           return err
        }
     是Iterate的第二个参数,是一个匿名函数

     func (session *Session) Iterate(bean interface{}, fun IterFunc) error
     type IterFunc func(idx int, bean interface{}) error 定义了一类第一个参数是int,第二个参数是任意类型,返回值是error的函数
     */

  /* Count方法
     统计数据使用Count方法,Count方法的参数为struct的指针并且成为查询条件。
     user := new(User)
     total, err := engine.Where("id >?", 1).Count(user)
  */

     u1 := new(User)
     total, err := engine.Where("id >?", 1).Count(u1)
     if err != nil {
        log.Fatal(err)
        return
     }
     fmt.Println("count方法,所有id>1的人总数为:", total)

     /*
        Rows方法和Iterate方法类似,提供逐条执行查询到的记录的方法,不过Rows更加灵活好用。
        user := new(User)
        rows, err := engine.Where("id >?", 1).Rows(user)
        if err != nil {
        }
        defer rows.Close()
        for rows.Next() {
           err = rows.Scan(user)
           //...
        }
     */

     u2 := new(User)
     rows, err := engine.Where("id >?", 1).Rows(u2)
     if err != nil {
        log.Fatal(err)
        return
     }
     defer rows.Close()
     for rows.Next() {
        err = rows.Scan(u2)
        fmt.Println("Rows方法,所有id>1的人的名字为:", u2.Name)
     }
  }

  /*输出:
  Iterate方法所有id>0的人的名字为: u0
  Iterate方法所有id>0的人的名字为: u1
  Iterate方法所有id>0的人的名字为: u2
  count方法,所有id>1的人总数为: 2
  Rows方法,所有id>1的人的名字为: u1
  Rows方法,所有id>1的人的名字为: u2

  */
  • id