当前位置: 首页 > 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.jsqmd.com/news/161265/

相关文章:

  • PyTorch-CUDA-v2.7镜像中恢复误删数据的应急处理流程
  • PyTorch-CUDA-v2.7镜像中构建高质量指令数据集的方法
  • 苍穹外卖——DAY6
  • PyTorch-CUDA-v2.7镜像中集成钉钉机器人推送告警消息
  • PyTorch-CUDA-v2.7镜像中使用pytest进行自动化测试
  • 计算机毕业设计260—基于Springboot+Vue3+Ai对话的非遗传承管理系统(源代码+数据库+2万字论文)
  • PyTorch-CUDA-v2.7镜像中编写Makefile简化常用命令
  • PyTorch-CUDA-v2.7镜像中备份数据库的自动化脚本编写
  • PyTorch-CUDA-v2.7镜像中导入已有镜像包节省下载时间
  • 2025年终证券开户券商推荐:服务能力与数字化水平双维度实测TOP5排名。 - 品牌推荐
  • 计算机毕业设计261—基于Springboot+vue3+小程序的社区医院人员和药品管理系统(源代码+数据库+开题+任务书+12000字论文)
  • PyTorch-CUDA-v2.7镜像中运行BERT模型的完整示例
  • PyTorch-CUDA-v2.7镜像中处理长文本生成的截断与拼接逻辑
  • PyTorch-CUDA-v2.7镜像中运行LLaMA-3模型的适配方案
  • PyTorch-CUDA-v2.7镜像中实现蓝绿部署减少服务中断时间
  • springboot欢迪迈手机商城设计与开发(11614)
  • PyTorch-CUDA-v2.7镜像中实现资源隔离防止越权访问
  • PyTorch-CUDA-v2.7镜像中设置多区域容灾备份方案
  • springboot宠物领养系统的设计与实现(11615)
  • PyTorch-CUDA-v2.7镜像中导出模型为TorchScript的方法
  • 深度学习实验室部署方案:批量分发PyTorch-CUDA-v2.7镜像
  • PyTorch-CUDA-v2.7镜像中实现个性化推荐提升用户粘性
  • 深度思考:随着上下文长度(Context Window)突破百万量级,向量数据库(Vector Store)是否还有存在的必要?
  • PyTorch-CUDA-v2.7镜像中运行Streamlit应用的可行性验证
  • 84156
  • springboot英语知识应用网站的设计与实现(11611)
  • 51655
  • PyTorch-CUDA-v2.7镜像内运行Flask服务的可行性分析
  • 【计算机毕业设计案例】基于SpringBoot+Vue的宠物成长监管服务平台设计与实现基于SpringBoot的宠物成长监管系统的设计与实现(程序+文档+讲解+定制)
  • springboot林业产品推荐系统(11612)