
GoFr 如何连接 Oracle 数据库Docker 准备 PDB 与驱动注入【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr本文的任务是用 Docker 拉起一个 Oracle Free Database 实例准备好可插拔数据库PDB和应用所需的表然后按照 GoFr 的数据源接口把 Oracle 驱动注入到 GoFr 应用中最终通过 HTTP 接口验证读写成功。适用前提是本地已安装 Docker并拥有一个可免费申请的 Oracle 账号用于登录 Oracle Container Registry。GoFr 通过 5 个环境变量定位 OracleHOST、PORT、USERNAME、PASSWORD、SERVICESERVICE为要连接的 Oracle 实例或服务名。为什么必须先用 Docker 准备 PDBGoFr 文档明确强调在运行 GoFr 应用之前Oracle 数据库和所需的 schema例如users表必须已经创建。原因是 Oracle 不允许通过标准客户端连接的一条简单 SQL 来创建数据库PDB 或 CDB必须使用 Oracle 工具如 DBCA、以 SYSDBA 身份登录的 SQL*Plus或 Docker 容器初始化预先建好数据库和 PDB应用只负责在已有 schema 内创建表。这就是本文操作顺序的依据Docker 实例化 → 建表 → 配置 GoFr → 注入驱动。用 Docker 启动 Oracle Free Database前提条件系统已安装 Docker并已注册 Oracle 账号访问 Oracle Container Registry 所需账号免费。在终端依次执行用 Oracle 账号登录容器镜像仓库docker login container-registry.oracle.com拉取 Oracle Free Database 镜像docker pull container-registry.oracle.com/database/free:latest启动容器。命令中的YourPasswordHere需要替换为你自己的强密码docker run -d --name oracle-free -p 1521:1521 -e ORACLE_PWDYourPasswordHere container-registry.oracle.com/database/free:latest启动后记住这几个连接事实后续配置直接使用数据库监听端口1521默认可插拔数据库PDBFREEPDB1system用户的密码即你传入的ORACLE_PWD连接使用的 service nameFREEPDB1用以下命令确认容器在运行docker ps可选进入容器用 SQL*Plus 手工确认连接。文档给出两种方式任选其一# 方式一直接建立 SQL*Plus 会话 docker exec -it oracle-free sqlplus system/YourPasswordHerelocalhost:1521/FREEPDB1 # 方式二先进 bash 再执行 SQL*Plus docker exec -it oracle-free bash sqlplus system/YourPasswordHerelocalhost:1521/FREEPDB1在 FREEPDB1 中创建 users 表GoFr 示例应用通过下面的 Go 结构体与users表交互字段通过db标签映射到列type User struct { Id string db:ID Name string db:NAME Age int db:AGE }在上面建立的 SQL*Plus 会话中执行建表语句CREATE TABLE users ( id VARCHAR2(36) PRIMARY KEY, name VARCHAR2(100), age NUMBER );执行完成后users表就处于应用可读写状态。这一步必须在启动 GoFr 应用之前完成。配置 GoFr 连接参数按文档给出的示例值本地 Docker 场景的连接参数如下配置项值hostlocalhostport1521usernamesystempassword你的ORACLE_PWD即YourPasswordHere的替换值service/SIDFREEPDB1GoFr 通过环境变量读取配置在项目根目录创建configs目录并放置.env文件详见 GoFr 配置说明。对应本文的 5 个键# configs/.env HOSTlocalhost PORT1521 USERNAMEsystem PASSWORDYourPasswordHere SERVICEFREEPDB1注入 Oracle 驱动GoFr 本身不内置 Oracle 驱动。它通过数据源接口扩展任何实现了下面接口的驱动都可以通过app.AddOracle()注入之后在应用里通过gofr.Context访问 Oracle。type Oracle interface { Exec(ctx context.Context, query string, args ...any) error Select(ctx context.Context, dest any, query string, args ...any) error }官方 Oracle 驱动作为外部包提供先安装go get gofr.dev/pkg/gofr/datasource/oraclelatestAddOracle的框架入口在 pkg/gofr/external_db.go官方实现位于 pkg/gofr/datasource/oracle/oracle.go其依赖的底层驱动是github.com/godror/godror见 pkg/gofr/datasource/oracle/go.mod。完整的示例程序如下。注意两处说明原文档示例在Password行后缺少一个逗号这里已补上当前源码中oracle.Config.Port是int类型而app.Config.Get返回字符串因此示例增加了strconv.Atoi转换否则代码无法编译。package main import ( strconv gofr.dev/pkg/gofr gofr.dev/pkg/gofr/datasource/oracle ) type User struct { Id string db:ID Name string db:NAME Age int db:AGE } func main() { app : gofr.New() port, _ : strconv.Atoi(app.Config.Get(PORT)) app.AddOracle(oracle.New(oracle.Config{ Host: app.Config.Get(HOST), Port: port, Username: app.Config.Get(USERNAME), Password: app.Config.Get(PASSWORD), Service: app.Config.Get(SERVICE), })) app.POST(/user, Post) app.GET(/user, Get) app.Run() } func Post(ctx *gofr.Context) (any, error) { err : ctx.Oracle.Exec(ctx, INSERT INTO users (id, name, age) VALUES (:1, :2, :3), 8f165e2d-feef-416c-95f6-913ce3172e15, aryan, 10) if err ! nil { return nil, err } return successfully inserted, nil } func Get(ctx *gofr.Context) (any, error) { var users []map[string]any err : ctx.Oracle.Select(ctx, users, SELECT id, name, age FROM users) if err ! nil { return nil, err } return users, nil }运行后 GoFr 默认在 8000 端口提供 HTTP 服务。验证连接与读写启动应用后用以下命令验证文档给出的验证方式创建一条用户记录curl -X POST http://localhost:8000/user执行成功后接口返回successfully inserted说明Exec写入路径打通。读取全部用户curl http://localhost:8000/user返回的 JSON 数组中应包含刚插入的记录说明Select查询路径打通。两条 curl 均通过即可确认 GoFr 已经成功连接 Docker 中的 Oracle 并完成读写。限制与注意事项数据库PDB/CDB与应用所需的users表都必须先于GoFr 应用存在应用自身不会替你创建它们Oracle 无法通过一条简单 SQL 从标准客户端连接创建 PDB。SERVICE填写的是连接目标本文 Docker 场景为FREEPDB1system用户密码与容器启动时的ORACLE_PWD保持一致二者不一致会导致连接失败。Oracle 不在框架内置数据源之列框架仅内置 MySQL 和 RedisOracle 必须以上述外部包方式注入见 数据源注入说明。更多 Oracle 连接参数与完整示例见 Oracle Database in GoFr。【免费下载链接】gofrAn opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.项目地址: https://gitcode.com/GitHub_Trending/go/gofr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考