尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

gorm如何调存储过程postgresql

gorm如何调存储过程postgresql
📅 发布时间:2026/6/20 9:17:47

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`。

相关新闻

  • PyTorch-CUDA-v2.7镜像中备份数据库的自动化脚本编写
  • 计算机毕业设计260—基于Springboot+Vue3+Ai对话的非遗传承管理系统(源代码+数据库+2万字论文)
  • PyTorch-CUDA-v2.7镜像中运行BERT模型的完整示例

最新新闻

  • 【自指性理论】光,既是推动,也是刹车——光致量子摩擦效应与容度原理解读
  • SpringBoot集成Gbase:从驱动获取到Druid数据源配置实战
  • 吉安遂川县专业查漏水仪器检测 卫生间厨房阳台 房屋地暖水管暗漏定位 - 同城资讯
  • 2026天津黄金回收实测:亲测跑了六家店,终于找到了靠谱不坑人的地方! - 讯息早知道
  • 2026年青岛市老百姓优先选择的五家贵金属回收门店 黄金回收白银回收铂金回收彩金回收合规靠谱门店测评合集+联系方式 - 亦辰小黄鸭
  • 苏州欧路达智能科技:工业物资智能管控柜及刀具管理柜全系解决方案推荐 - 品牌推荐官

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号