news 2026/5/23 15:19:44

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/5/21 7:36:30

PyTorch-CUDA-v2.7镜像中设计A/B测试验证新功能有效性

PyTorch-CUDA-v2.7镜像中设计A/B测试验证新功能有效性 在现代AI研发体系中,一个看似微小的模型改动——比如更换激活函数、调整优化器参数,甚至只是升级了框架版本——都可能对最终性能产生深远影响。然而,如何科学地判断这种“改进”是否真的…

作者头像 李华
网站建设 2026/5/1 13:59:58

PyTorch-CUDA-v2.7镜像中提供uptime监控页面展示服务状态

PyTorch-CUDA-v2.7 镜像中的 Uptime 监控:让 AI 开发环境“看得见” 在深度学习项目中,最怕的不是模型不收敛,而是你半夜醒来发现训练任务早已静默崩溃——没有日志、没有告警,只有空荡荡的终端和丢失的一周算力。更糟的是&#x…

作者头像 李华
网站建设 2026/5/10 15:20:23

PyTorch-CUDA-v2.7镜像资源限制设置:CPU和内存配额分配

PyTorch-CUDA-v2.7镜像资源限制设置:CPU和内存配额分配 在现代AI开发环境中,你是否曾遇到这样的场景:团队成员在同一台GPU服务器上运行任务,突然某个训练进程“吃光”了所有CPU和内存,导致整个系统卡顿甚至崩溃&#x…

作者头像 李华
网站建设 2026/5/22 19:41:18

PyTorch-CUDA-v2.7镜像中备份数据库的自动化脚本编写

PyTorch-CUDA-v2.7镜像中备份数据库的自动化脚本编写 在现代AI平台日益复杂的运维场景下,一个常被忽视的问题浮出水面:我们投入大量资源优化模型训练速度和GPU利用率,却往往忽略了支撑这些实验的“幕后英雄”——数据库。无论是存储超参数配置…

作者头像 李华
网站建设 2026/5/1 13:48:57

PyTorch-CUDA-v2.7镜像中接入WebSocket实现实时监控推送

PyTorch-CUDA-v2.7镜像中接入WebSocket实现实时监控推送 在现代AI研发实践中,一个常见的痛点是:你启动了模型训练任务,然后只能盯着日志文件或等待TensorBoard刷新——整个过程就像在“盲跑”。尤其当训练周期长达数小时甚至数天时&#xff0…

作者头像 李华
网站建设 2026/5/21 18:15:51

PyTorch-CUDA-v2.7镜像中启用TensorBoard可视化工具

PyTorch-CUDA-v2.7镜像中启用TensorBoard可视化工具 在深度学习项目开发过程中,模型训练早已不再是单纯的“跑通代码”那么简单。随着网络结构日益复杂、数据规模不断增长,开发者面临的挑战也从“能不能训出来”转向了“为什么训得不好”。此时&#xff…

作者头像 李华