执行SQL方式与ORM方式查询调用Find()方法的区别
采用Sql(),SqlMapClient(),SqlTemplateClient()方法执行sql调用Find()方法,与ORM方式调用Find()方法内部逻辑最大不同在于此时Find()方法中的参数,即传参结构体的名字不需要与数据库表的名字映射(因为前面的Sql()方法已经确定了执行SQL语句),但字段名需要和数据库中的字段名字做映射,以便查询结果集映射到结构体。
使用Find()方法需要自己定义查询返回结果集的结构体,如不想自己定义结构体可以使用Query()方法,返回[]map[string]interface{},两种方式请依据实际需要选用。
举例,多表联合查询例子如下:
//执行的SQL如下,查询的是article表与category表,查询的表字段是这两个表的部分字段
sql := `SELECT
article.id,
article.title,
article.isdraft,
article.lastupdatetime,
category.name as categoryname
FROM
article,
category
WHERE
article.categorysubid = category. ID
AND category. ID = 4`
//我们可以定义一个结构体,注意:结构体中的字段名和上面执行的SQL语句字段名映射,字段数据类型正确
//当然你还可以给这个结构体加更多其他字段,但是如果执行上面的SQL语句时,这些其他字段只会被赋值对应数据类型的零值
type CategoryInfo struct {
Id int
Title string
Categoryname string
Isdraft int
Lastupdatetime time.Time
}
var categoryinfo []CategoryInfo
//执行sql,返回值为error对象,同时查询的结果集会被赋值给[]CategoryInfo
err = db.Sql(sql).Find(&categoryinfo)
if err != nil {
t.Fatal(err)
}
t.Log(categoryinfo)
t.Log(categoryinfo[0].Categoryname)
t.Log(categoryinfo[0].Id)
t.Log(categoryinfo[0].Title)
t.Log(categoryinfo[0].Isdraft)
t.Log(categoryinfo[0].Lastupdatetime)