xorm 2022-03-16
2022-03-16 本文已影响0人
9_SooHyun
xorm set default value when inserting data
定义如下结构体,映射数据库表my_struct
type MyStruct struct {
Number int `xorm:"not null default 10 INT(8)"`
}
// will number be set to default value 10 in the database? no
data := MyStruct{}
*xorm.Session.Insert(&data)
// 在insert的时候,xorm会根据传入struct的field-value对应关系一一插入数据库
// data是一个默认初始化的MyStruct,Number值为0,因此会往数据库里面插入0,而不是10
// 那么如何使用xorm 的 default value呢?
// 使用*xorm.Session.Cols(columns ...string)或者*xorm.Session.Omit(columns ...string)
// 指定insert的字段,那么未指定的就会使用default value
xorm not automatically give created field and updated field the current time
use NoAutoTime()
func (session *Session) NoAutoTime() *Session {
session.statement.UseAutoTime = false
return session
}
xorm的 extends
tag
orm模型下,一个结构体可以映射为数据库的一张表
在未显式指定查询的目标表的情况下,xorm可以根据传给Get()或者Find()的结构体对象或者对象指针,自动判断要查找的目标表
因此单表查询时,可以不必显式指定查询的目标表
当多表联查时,我们需要设置辅助结构体来存储查询结果
这个时候辅助结构体对应不上任何表名,因为它对应的是多表关联后的大表,如果仍然靠Find()、Get()自动推定查询表,必然会产生错误的sql
因此,多表联查时,
- 显式指定查询的目标表
- 使用
extends
tag
extends
tag 告诉xorm在查找结果赋值时,完全展开extends
标记的字段
如果辅助结构体有一个匿名结构体字段但未加extends
tag,那么该匿名结构体不会被结果赋值
两种方法:要么匿名结构体字段而加extends
,要么显式地手动展开所有的字段