栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

详解gorm联合查询 && (on conflict do update set)

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解gorm联合查询 && (on conflict do update set)

联合(join)查询的类型:

1)内联接(inner join):将两个表中存在联接关系的字段符合联接条件的记录形成记录集;

如:Select A.name,B.name from A inner join B on A.id = B.id   和

Select A.name,b.name from A,B where A.id = B.id 结果是一样的(内联结的inner关键字可忽略)

2)外联接(分为左外联接和右外联接)

左联接A、B表,结果包括A的全部记录和符合条件的B的记录;右联结A、B表和左连接B、A表的结果是一样的。即:

Select A.name ,B.name from  A left join B on A.id = B.id   和

Select A.name ,B.name from B right join A on A.id = B.id 执行后的结果是一样的。

3)外联结的高级用法:三表联合查询;

例如:select username, pwd, gname, tel from (t1 left join t2 on t1.t1_id = t2.t1_id) left join t3 on t1.t1_id = t3.t1_id

所以在golang语言中,联合查询只用left join足够了,内联合查询用where条件语句就可替代。

gorm 的left join

1)定义表结构

type GoSystemInfo struct {
    ID           int    `gorm:"primary_key"`
    SystemId     string `gorm:"column:systemId;not null;index:SystemId"`
    SystemName   string `gorm:"column:systemName;;default:'defaultNull'"`
}
type GoServiceInfo struct {
    ID           int    `gorm:"primary_key"`
    SystemId     string `gorm:"column:systemId;not null;index:SystemId"`
    ServiceId    string `gorm:"column:serviceId;index:ServiceId"`
    ServiceName  string `gorm:"column:serviceName;default:'defaultNull'"`
}

2)定义接收查询数据的表结构

type Rresult struct {
    SystemId    string `json:"systemId"`
    SystemName  string `json:"systemName"`
    ServiceId   string `json:"serviceId"`
    ServiceName string `json:"serviceName"`
}


var results []Result

3)两个表进行联合查询

使用orm:

db.Table("go_service_info").
Select("go_service_info.serviceId as service_id, 
go_service_info.serviceName as service_name, 
go_system_info.systemId as system_id, 
go_system_info.systemName as system_name").
Joins("left join go_system_info on 
go_service_info.systemId = go_system_info.systemId").
Scan(&results)

原生sql:

db.
Raw("SELECT a.serviceId as service_id, a.serviceName as service_name, 
b.systemId as system_id, b.systemName as system_name 
FROM go_service_info a LEFT JOIN go_system_info b 
ON a.systemId = b.systemId").Scan(&results)

备注:使用别名 as system_id,用于映射返回值结构体。

4)需要用到条件的联合查询(where条件)

使用orm:

db.Table("go_service_info").
Select("go_service_info.serviceId as service_id, 
go_service_info.serviceName as service_name, 
go_system_info.systemId as system_id, 
go_system_info.systemName as system_name").
Joins("left join go_system_info on 
go_service_info.systemId = go_system_info.systemId 
where go_service_info = ? and go_system_info.systemId = ?","xxxx","xxxxx").
Scan(&results)

原生sql:

db.
Raw("SELECT a.serviceId as service_id, a.serviceName as service_name, 
b.systemId as system_id, b.systemName as system_name 
FROM go_service_info a LEFT JOIN go_system_info b 
ON a.systemId = b.systemId 
where a.serviceId = ? and b.systemId = ?","xxxx","xxxxx").Scan(&results)

插入多个字段,但是只想更新某个字段的情况(on conflict):

sql:

INSERT INTO table_name(uid, xxx_id,answer, times) VALUES (?,?,?,?) 
ON CONFLICT (uid, xxx_id)DO UPDATE SET 
answer = EXCLUDED.answer,times = EXCLUDED.times

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号