xorm 常见问题

  1. 如何使用Like:
    engine.Where("column like ?", "%"+char+"%").Find
  2. 怎么同时使用xorm 的tag 和json 的tag ?
    使用空格:
type User struct {
    Name string `json:"name" xorm:"name"`
}
  1. struct 里面包含bool 类型,为什么它不能作为条件也没法用Update 更新?
    默认bool 类型因为无法判断是否为空,所以不会自动作为条件也不会作为Update 的内容。可以使用UseBool 函数,也可以使用Cols 函数:
engine.Cols("bool_field").Update(&Struct{BoolField:true})
// UPDATE struct SET bool_field = true
  1. struct里面包含float64和 float32 类型,为什么用他们作为查询条件总是不正确?
    默认float32 和 float64 映射到数据库中为float,real,double 这几种类型,这几种数据类型数据库的实现一般都是非精确的。因此作为相等条件查询有可能不会返回正确的结果。如果一定要作为查询条件,请将数据库中的类型定义为Numeric 或者 Decimal。
type account struct {
   money float64 `xorm:"Numeric"`
}
  1. 为什么Update 时Sqlite3 返回的affected 和其他数据库不一样?
    Sqlite3 默认Update 时返回的是update 的查询条件的记录数条数,不管记录是否真的有更新。而Mysql 和Postgres 默认情况下都是只返回记录中有字段改变的记录数。
  2. xorm 有几种命名映射规则:
    目前支持SnakeMapper 和 SameMapper 俩种。SnakeMapper 支持结构体和成员以驼峰式命名而数据库表和字段以下划线连接命名;SameMapper 支持结构体和数据库的命名保持一致的映射。
  3. xorm 支持复合主键吗?
    支持。在定义时,如果有多个字段标记了pk,则这些字段自动成为复合主键,顺序为在struct 中出现的顺序。在使用Id方法时,可以用Id(xorm.PK{1,2}) 的方式来用。
  4. xorm 如何使用join?
    一般配合 Join() 和 extends 标记来进行,比如要对2个表进行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)
  1. 如果有自动增长的字段,Insert 如何写?
    Insert时,如果需要自增字段填充为自动增长的数值,请保持自增字段为0;如果自增字段非0,自增字段将会被作为普通字段插入。

  2. 结构体自动忽略空字段:在xorm 中,结构体会自动忽略空字段(或者说:默认值:如int 的 0,string 的"")。 可以把结构体中的字段,提到where 语句的条件中:

orm.Get(&User{Name:""}) //获取Name为空的用户
//可以改为
orm.Where("name = ?","").Get(&User{})
  1. update 时指定主键: update 如果不指定主键,会把全表更新,需要明确指定主键:
orm.Id(id).Update(&User{Name:"name"})

update 时可以传入结构指针或map[string]interface{}。对于传入结构体指针的情况,xorm只会更新非空的字段。如果一定要更新空字段,需要使用Cols() 方法显示指定更新的列。使用Cols方法指定列后,即使字段为空也会更新。(如:要更新一个int 类型的字段值为0,如果不用Cols() 会忽略该字段,不更新。所以要使用Cols 更新一些默认值得字段)

上一篇:OpenCV-Python图像透视


下一篇:VtkImageData类型数据转为Python中的Numpy.array数据