在 Go 语言中,你可以使用 Godror 这个库来连接 Oracle 数据库。Godror 是一个支持 Oracle Database 的 Go 驱动程序,基于 Oracle 的 ODPI-C 库开发,性能较高且功能强大。
1. 安装 Godror
要使用 Godror,首先需要安装 Oracle 客户端库。可以选择安装完整的 Oracle 客户端,也可以安装更轻量的 Oracle Instant Client。你可以在 Oracle 官网 下载 Instant Client。
安装完 Instant Client 后,设置环境变量 LD_LIBRARY_PATH
(Linux/Mac)或 PATH
(Windows),指向 Instant Client 的库文件夹。
export LD_LIBRARY_PATH=/path/to/instantclient
安装 Godror:
go get github.com/godror/godror
2. 初始化 Oracle 连接
以下是连接 Oracle 数据库的基本代码示例:
package main
import (
"context"
"database/sql"
"fmt"
"log"
_ "github.com/godror/godror"
)
func main() {
// 配置连接字符串
dsn := "user/password@host:port/service_name"
// 连接数据库
db, err := sql.Open("godror", dsn)
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
defer db.Close()
// 检查连接
if err = db.Ping(); err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
fmt.Println("连接成功")
}
参数解释:
user
: 数据库用户名password
: 数据库密码host
: Oracle 数据库主机地址port
: Oracle 数据库端口(默认 1521)service_name
: Oracle 服务名(可以在 TNS 中找到)
3. 实现增删改查
3.1 插入数据
func insertData(db *sql.DB) {
query := `INSERT INTO employees (id, name, salary) VALUES (:1, :2, :3)`
_, err := db.Exec(query, 1, "John Doe", 50000)
if err != nil {
log.Fatalf("插入数据失败: %v", err)
}
fmt.Println("数据插入成功")
}
3.2 查询数据
func queryData(db *sql.DB) {
query := `SELECT id, name, salary FROM employees WHERE id = :1`
rows, err := db.Query(query, 1)
if err != nil {
log.Fatalf("查询数据失败: %v", err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var salary float64
if err := rows.Scan(&id, &name, &salary); err != nil {
log.Fatalf("读取行数据失败: %v", err)
}
fmt.Printf("ID: %d, Name: %s, Salary: %.2f\n", id, name, salary)
}
}
3.3 更新数据
func updateData(db *sql.DB) {
query := `UPDATE employees SET salary = :1 WHERE id = :2`
_, err := db.Exec(query, 60000, 1)
if err != nil {
log.Fatalf("更新数据失败: %v", err)
}
fmt.Println("数据更新成功")
}
3.4 删除数据
func deleteData(db *sql.DB) {
query := `DELETE FROM employees WHERE id = :1`
_, err := db.Exec(query, 1)
if err != nil {
log.Fatalf("删除数据失败: %v", err)
}
fmt.Println("数据删除成功")
}
4. 完整示例
package main
import (
"context"
"database/sql"
"fmt"
"log"
_ "github.com/godror/godror"
)
func main() {
dsn := "user/password@host:port/service_name"
db, err := sql.Open("godror", dsn)
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
defer db.Close()
if err = db.Ping(); err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
fmt.Println("连接成功")
insertData(db)
queryData(db)
updateData(db)
deleteData(db)
}
// 插入数据
func insertData(db *sql.DB) {
query := `INSERT INTO employees (id, name, salary) VALUES (:1, :2, :3)`
_, err := db.Exec(query, 1, "John Doe", 50000)
if err != nil {
log.Fatalf("插入数据失败: %v", err)
}
fmt.Println("数据插入成功")
}
// 查询数据
func queryData(db *sql.DB) {
query := `SELECT id, name, salary FROM employees WHERE id = :1`
rows, err := db.Query(query, 1)
if err != nil {
log.Fatalf("查询数据失败: %v", err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var salary float64
if err := rows.Scan(&id, &name, &salary); err != nil {
log.Fatalf("读取行数据失败: %v", err)
}
fmt.Printf("ID: %d, Name: %s, Salary: %.2f\n", id, name, salary)
}
}
// 更新数据
func updateData(db *sql.DB) {
query := `UPDATE employees SET salary = :1 WHERE id = :2`
_, err := db.Exec(query, 60000, 1)
if err != nil {
log.Fatalf("更新数据失败: %v", err)
}
fmt.Println("数据更新成功")
}
// 删除数据
func deleteData(db *sql.DB) {
query := `DELETE FROM employees WHERE id = :1`
_, err := db.Exec(query, 1)
if err != nil {
log.Fatalf("删除数据失败: %v", err)
}
fmt.Println("数据删除成功")
}
5. 注意事项
- ODPI-C 依赖:Godror 依赖 Oracle 的 ODPI-C 库,因此需要安装 Oracle Instant Client。
- 环境变量配置:确保配置
LD_LIBRARY_PATH
(Linux/Mac)或PATH
(Windows)环境变量,以便 Go 程序可以找到 Oracle 客户端库。 - 错误处理:生产环境下,建议使用
context.Context
进行数据库操作,并且对可能发生的错误进行详细处理。
这样,你就可以使用 Go 语言与 Oracle 数据库进行交互,实现基本的增删改查功能。