news 2026/8/9 11:00:53

gorm如何调存储过程postgresql

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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`。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 21:12:47

PyTorch-CUDA-v2.7镜像中打包自定义Python模块的方法

PyTorch-CUDA-v2.7镜像中打包自定义Python模块的方法 在深度学习项目开发过程中,一个常见的痛点是:明明在本地跑得通的模型代码,换到服务器或同事机器上就报错——不是CUDA版本不匹配,就是某个自定义模块导入失败。这种“在我机器…

作者头像 李华
网站建设 2026/7/31 9:38:54

PyTorch-CUDA-v2.7镜像中实现敏感词检测与替换机制

PyTorch-CUDA-v2.7 镜像中实现敏感词检测与替换机制 在当今内容爆炸的数字时代,社交平台、在线教育、客服系统等场景每天面临海量文本输入。如何高效、准确地识别并处理其中的违规表达,已成为企业合规运营的关键挑战。传统的敏感词过滤多依赖正则匹配或调…

作者头像 李华
网站建设 2026/8/6 1:30:44

PyTorch-CUDA-v2.7镜像中设置webhook触发自动化流程

PyTorch-CUDA-v2.7镜像中设置webhook触发自动化流程 在AI研发日益工程化的今天,一个常见的痛点是:开发者提交代码后,还得手动登录远程训练服务器,拉取最新代码、激活环境、启动脚本——这一连串操作不仅耗时,还容易因…

作者头像 李华
网站建设 2026/8/3 18:01:34

快慢双指针算法笔记

文章目录场景解决方案为什么要以值作为下标?双指针严格来说不是一种算法,而是一种思路。场景 数组长度为n1,值在1~n之间,有且仅有一个重复数。 1. 数组值在合法下标范围内(如长度为n1,值在1~n之间) 2. 可…

作者头像 李华
网站建设 2026/8/8 1:21:06

springboot人口老龄化社区服务与管理平台(11613)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/8/9 23:23:18

PyTorch-CUDA-v2.7镜像中实现按token计费的计量系统原型

PyTorch-CUDA-v2.7镜像中实现按token计费的计量系统原型 在AI推理服务日益普及的今天,如何对模型调用进行精细化资源管理,已经成为云平台和企业级AI系统的共同挑战。传统的“按请求次数”或“按时长计费”模式,难以准确反映实际计算消耗——一…

作者头像 李华