在 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. 注意事项

  1. ODPI-C 依赖:Godror 依赖 Oracle 的 ODPI-C 库,因此需要安装 Oracle Instant Client。
  2. 环境变量配置:确保配置 LD_LIBRARY_PATH(Linux/Mac)或 PATH(Windows)环境变量,以便 Go 程序可以找到 Oracle 客户端库。
  3. 错误处理:生产环境下,建议使用 context.Context 进行数据库操作,并且对可能发生的错误进行详细处理。

这样,你就可以使用 Go 语言与 Oracle 数据库进行交互,实现基本的增删改查功能。