This repository has been archived on 2022-04-14. You can view files and clone it, but cannot push or open issues or pull requests.
manual-zh-CN/chapter-14
2020-10-20 12:48:03 +08:00
..
README.md 更新Update 2020-10-20 12:48:03 +08:00

常见问题

  • 如何使用Like

答:

engine.Where("column like ?", "%"+char+"%").Find
  • 怎么同时使用xorm的tag和json的tag

答:使用空格

type User struct {
    Name string `json:"name" xorm:"name"`
}
  • 我的struct里面包含bool类型为什么它不能作为条件也没法用Update更新

默认bool类型因为无法判断是否为空所以不会自动作为条件也不会作为Update的内容。可以使用UseBool函数也可以使用Cols函数

engine.Cols("bool_field").Update(&Struct{BoolField:true})
// UPDATE struct SET bool_field = true
  • 我的struct里面包含float64和float32类型为什么用他们作为查询条件总是不正确

默认float32和float64映射到数据库中为float,real,double这几种类型这几种数据库类型数据库的实现一般都是非精确的。因此作为相等条件查询有可能不会返回正确的结果。如果一定要作为查询条件请将数据库中的类型定义为Numeric或者Decimal。

type Account struct {
    Money float64 `xorm:"Numeric"`
}
  • 为什么Update时Sqlite3返回的affected和其它数据库不一样

Sqlite3默认Update时返回的是update的查询条件的记录数条数不管记录是否真的有更新。而Mysql和Postgres默认情况下都是只返回记录中有字段改变的记录数。

  • xorm有几种命名映射规则

目前支持SnakeMapper, SameMapper和GonicMapper三种。SnakeMapper支持结构体和成员以驼峰式命名而数据库表和字段以下划线连接命名SameMapper支持结构体和数据库的命名保持一致的映射。GonicMapper在SnakeMapper的基础上对一些特定名词比如ID的映射会映射为id而不是像SnakeMapper那样为i_d。

  • xorm支持复合主键吗

支持。在定义时如果有多个字段标记了pk则这些字段自动成为复合主键顺序为在struct中出现的顺序。在使用Id方法时可以用ID(xorm.PK{1, 2})的方式来用。

  • xorm如何使用Join

一般我们配合Join()和extends标记来进行比如我们要对两个表进行Join操作我们可以这样

type Userinfo struct {
    Id int64
    Name string
    DetailId int64
}

type Userdetail struct {
    Id int64
    Gender int
}

type User struct {
    Userinfo `xorm:"extends"`
    Userdetail `xorm:"extends"`
}

var users = make([]User, 0)
err := engine.Table(&Userinfo{}).Join("LEFT", "userdetail", "userinfo.detail_id = userdetail.id").Find(&users)

请注意这里的Userinfo在User中的位置必须在Userdetail的前面因为他在join语句中的顺序在userdetail前面。如果顺序不对那么对于同名的列有可能会赋值出错。

当然如果Join语句比较复杂我们也可以直接用Sql函数

err := engine.Sql("select * from userinfo, userdetail where userinfo.detail_id = userdetail.id").Find(&users)
  • 如果有自动增长的字段Insert如何写Insert时如果需要自增字段填充为自动增长的数值请保持自增字段为0如果自增字段为非0自增字段将会被作为普通字段插入。

  • 如果设置数据库时区? 答:

location, err = time.LoadLocation("Asia/Shanghai")
engine.TZLocation = location