news 2026/4/15 17:55: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/4/16 9:01:39

PyTorch-CUDA-v2.7镜像中集成钉钉机器人推送告警消息

PyTorch-CUDA-v2.7 镜像中集成钉钉机器人推送告警消息 在深度学习项目日益复杂的今天,一个常见的痛点是:你启动了一个长达数小时的训练任务,满怀期待地去吃饭、开会或休息,结果回来发现训练早已因显存溢出、数据加载错误或网络断开…

作者头像 李华
网站建设 2026/4/15 7:45:25

PyTorch-CUDA-v2.7镜像中使用GitHub Actions实现CI/CD

PyTorch-CUDA-v2.7 镜像与 GitHub Actions 的 CI/CD 实践 在深度学习项目日益复杂的今天,一个常见的痛点是:代码在本地训练完美,推送到远程仓库后却因环境差异导致测试失败。更糟糕的是,当团队成员增多时,“在我机器上…

作者头像 李华
网站建设 2026/4/15 11:06:36

PyTorch-CUDA-v2.7镜像中调试模型的技巧:pdb与print组合使用

PyTorch-CUDA-v2.7镜像中调试模型的技巧:pdb与print组合使用 在深度学习项目开发过程中,一个看似微小的维度错位或梯度中断,就可能导致整个训练流程崩溃。尤其是在使用 GPU 加速的复杂环境中,错误信息往往晦涩难懂,比如…

作者头像 李华
网站建设 2026/4/13 17:54:09

PyTorch-CUDA-v2.7镜像中构建高质量指令数据集的方法

PyTorch-CUDA-v2.7镜像中构建高质量指令数据集的方法 在大语言模型(LLM)训练日益依赖海量高质量数据的今天,如何高效、稳定地构建“指令-输入-输出”三元组格式的数据集,已成为许多AI团队的核心挑战。一个典型场景是:你…

作者头像 李华
网站建设 2026/4/15 18:10:36

PyTorch-CUDA-v2.7镜像中加载通义千问的Tokenizers方法

PyTorch-CUDA-v2.7镜像中加载通义千问的Tokenizers方法 在大模型落地加速的今天,一个常见的工程难题浮出水面:如何在一个稳定、高效且开箱即用的环境中,快速加载并运行像通义千问这样的国产大语言模型?尤其当团队成员频繁遭遇“我…

作者头像 李华
网站建设 2026/4/12 18:49:51

PyTorch-CUDA-v2.7镜像中设置token使用额度告警机制

PyTorch-CUDA-v2.7镜像中设置token使用额度告警机制 在现代AI开发环境中,一个看似微不足道的API调用,可能悄然累积成惊人的成本账单。想象一下:你在PyTorch-CUDA-v2.7容器里调试模型增强流程,反复调用OpenAI接口生成训练样本——每…

作者头像 李华