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 告诉xorm在查找结果赋值时,完全展开extends标记的字段
如果辅助结构体有一个匿名结构体字段但未加extends tag,那么该匿名结构体不会被结果赋值
两种方法:要么匿名结构体字段而加extends,要么显式地手动展开所有的字段

上一篇 下一篇

猜你喜欢

热点阅读