当前位置: 首页 > news >正文

gorm如何调存储过程postgresql

GORM 本身不封装“存储过程”概念,但可以直接拿 `*gorm.DB` 当原生 SQL 执行器用,把 PostgreSQL 的 函数(或 v11+ 的 PROCEDURE)当成普通 SQL 去调即可。核心就两步:

1. 用 `db.Raw(...).Scan(...)` 调函数;
2. 有 OUT 参数或返回结果集时,按 PostgreSQL 语法把结果 `SELECT` 出来,再扫到 Go 结构体里。

下面给出完整可运行示例(GORM v2 + pgx 驱动)。

---

一、准备 PostgreSQL 端

```sql
-- 返回结果集的函数(最常用)
CREATE OR REPLACE FUNCTION get_user_info(uid int)
RETURNS TABLE(id bigint, name varchar, age int) AS $$
BEGIN
RETURN QUERY SELECT u.id, u.name, u.age FROM users u WHERE u.id = uid;
END;
$$ LANGUAGE plpgsql;

-- 带 IN/OUT 参数的函数
CREATE OR REPLACE FUNCTION add_user(IN p_name varchar, IN p_age int,
OUT new_id bigint, OUT msg text)
AS $$
BEGIN
INSERT INTO users(name, age) VALUES (p_name, p_age) RETURNING id INTO new_id;
msg := 'ok';
END;
$$ LANGUAGE plpgsql;
```

---

二、Go 端代码

```go
package main

import (
"fmt"
"log"

"gorm.io/driver/postgres"
"gorm.io/gorm"
)

type User struct {
ID int64 `gorm:"column:id"`
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
}

func main() {
dsn := "host=127.0.0.1 user=postgres password=123 db=gorm port=5432 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalln(err)
}

// 1. 调函数返回结果集
var rows []User
if err := db.Raw("SELECT * FROM get_user_info(?)", 1).Scan(&rows).Error; err != nil {
log.Println(err)
}
fmt.Printf("结果集: %+v\n", rows)

// 2. 调函数取 OUT 参数
var newID int64
var msg string
db.Raw("SELECT * FROM add_user(?,?)", "tom", 18).Row().Scan(&newID, &msg)
fmt.Printf("新ID=%d msg=%s\n", newID, msg)
}
```

---

三、几点注意
1. PostgreSQL 11 以后才有真正的 `PROCEDURE`,老版本只有函数;GORM 统一用 `SELECT/VALUES` 语法即可 。
2. 如果函数返回复合类型或 refcursor,需要再包一层 `SELECT * FROM func(...)` 才能被 `Scan` 识别 。
3. 事务、参数化、连接池都由 GORM 托管,放心使用 `db.Raw` 即可,无需额外取 `*sql.DB`。

http://www.rkmt.cn/news/176647.html

相关文章:

  • PyTorch-CUDA-v2.7镜像中备份数据库的自动化脚本编写
  • 计算机毕业设计260—基于Springboot+Vue3+Ai对话的非遗传承管理系统(源代码+数据库+2万字论文)
  • PyTorch-CUDA-v2.7镜像中运行BERT模型的完整示例
  • PyTorch-CUDA-v2.7镜像中运行LLaMA-3模型的适配方案
  • PyTorch-CUDA-v2.7镜像中实现蓝绿部署减少服务中断时间
  • springboot欢迪迈手机商城设计与开发(11614)
  • PyTorch-CUDA-v2.7镜像中导出模型为TorchScript的方法
  • 深度学习实验室部署方案:批量分发PyTorch-CUDA-v2.7镜像
  • springboot英语知识应用网站的设计与实现(11611)
  • PyTorch-CUDA-v2.7镜像中实现个性化推荐提升用户粘性
  • PyTorch-CUDA-v2.7镜像内运行Flask服务的可行性分析
  • 【计算机毕业设计案例】基于SpringBoot+Vue的宠物成长监管服务平台设计与实现基于SpringBoot的宠物成长监管系统的设计与实现(程序+文档+讲解+定制)
  • 技术团队的人才系统:如何像设计架构一样,设计人才的涌现与传承?
  • 基于知识图谱的大规模推理系统优化技术
  • 技术管理者的时间悖论:为何你越努力,团队越受限?
  • PyTorch-CUDA-v2.7镜像中安装OpenCV的正确方式
  • 孩子小学就近视?除了戴眼镜,这些措施能延缓度数增长
  • PyTorch-CUDA-v2.7镜像中同步系统时间与时区配置
  • 【计算机毕业设计案例】基于springboot的大学生一体化服务系统组队拼车管理,拼车信息管理,(程序+文档+讲解+定制)
  • Java面试必问:什么是阻塞式方法?
  • 【毕业设计】基于SpringBoot+Vue+Mysql的大学生一体化服务平台基于springboot的大学生一体化服务系统(源码+文档+远程调试,全bao定制等)
  • PyTorch-CUDA-v2.7镜像日志轮转(log rotation)配置方法
  • PyTorch-CUDA-v2.7镜像中启用CUDA Graph提升推理效率
  • PyTorch-CUDA-v2.7镜像中设置随机种子保证实验可重复性
  • GitLab多分支关键字批量扫描工具设计与实现(含源码)
  • GitHub星标超10K!PyTorch-CUDA-v2.7镜像为何如此受欢迎?
  • PyTorch-CUDA-v2.7镜像健康检查命令:监控容器状态
  • comsol增材制造选区激光熔化SLM的粉床数值模拟 l模型的建立都有讲解,以及后处理的操作...
  • 医疗影像分析系统构建:基于PyTorch-CUDA-v2.7的诊断平台
  • PyTorch-CUDA-v2.7镜像定制化修改教程:添加自定义依赖包