Go:开发命令行工具访问 Oracle 数据库

12 阅读2分钟

概述

本文将介绍如何基于提供的 Go 语言代码,开发一个命令行工具,用于用户输入参数测试登录 Oracle 数据库并执行简单的 SQL 查询。该工具将采用提供的 loginWithServiceName 函数来实现数据库连接,并扩展其功能以支持命令行交互。

代码实现

image.png 首先,我们将现有的 loginWithServiceName 函数封装到一个命令行工具中,并添加参数解析和简单的 SQL 执行功能。

1. 定义命令行参数

我们将使用 flag 包来解析命令行参数。命令行工具需要以下参数:

  • host: Oracle 数据库主机地址
  • port: Oracle 数据库端口
  • username: 用户名
  • password: 密码
  • serviceName: 服务名
  • sql: 要执行的 SQL 查询
package main

import (
    "database/sql"
    "flag"
    "fmt"
    "log"
    "strconv"

    go_ora "github.com/sijms/go-ora/v2"
)

type OracleConnectRole string

const (
    OracleConnectRoleSysdba  OracleConnectRole = "sysdba"
    OracleConnectRoleSysoper OracleConnectRole = "sysoper"
    OracleConnectRoleNormal  OracleConnectRole = "normal"
)

func loginWithServiceName(host, port, username, password, serviceName string, role OracleConnectRole) (*sql.DB, error) {
    urlOptions := map[string]string{}
    switch role {
    case OracleConnectRoleSysdba:
        urlOptions["dba privilege"] = string(role)
    case OracleConnectRoleSysoper:
        urlOptions["dba privilege"] = string(role)
    }
    iPort, err := strconv.Atoi(port)
    if err != nil {
        return nil, err
    }
    connStr := go_ora.BuildUrl(host, iPort, serviceName, username, password, urlOptions)
    conn, err := sql.Open("oracle", connStr)
    if err != nil {
        return nil, err
    }
    // check for error
    err = conn.Ping()
    if err != nil {
        return nil, err
    }
    return conn, nil
}

func main() {
    host := flag.String("host", "", "Oracle DB host")
    port := flag.String("port", "1521", "Oracle DB port")
    username := flag.String("username", "", "Username")
    password := flag.String("password", "", "Password")
    serviceName := flag.String("serviceName", "", "Service name")
    sqlQuery := flag.String("sql", "", "SQL query to execute")

    flag.Parse()

    if *host == "" || *username == "" || *password == "" || *serviceName == "" || *sqlQuery == "" {
        log.Fatal("All parameters are required")
    }

    conn, err := loginWithServiceName(*host, *port, *username, *password, *serviceName, OracleConnectRoleNormal)
    if err != nil {
        log.Fatalf("Failed to connect to Oracle DB: %v", err)
    }
    defer conn.Close()

    rows, err := conn.Query(*sqlQuery)
    if err != nil {
        log.Fatalf("Failed to execute query: %v", err)
    }
    defer rows.Close()

    cols, err := rows.Columns()
    if err != nil {
        log.Fatalf("Failed to get columns: %v", err)
    }

    for rows.Next() {
        columns := make([]interface{}, len(cols))
        columnPointers := make([]interface{}, len(cols))
        for i := range columns {
            columnPointers[i] = &columns[i]
        }

        if err := rows.Scan(columnPointers...); err != nil {
            log.Fatalf("Failed to scan row: %v", err)
        }

        for i, colName := range cols {
            fmt.Printf("%s: %v\n", colName, columns[i])
        }
        fmt.Println("-----------------------------------")
    }

    if err := rows.Err(); err != nil {
        log.Fatalf("Error during rows iteration: %v", err)
    }
}

运行工具

编译并运行上述 Go 代码后,用户可以通过命令行参数传递数据库连接信息和要执行的 SQL 查询。例如:

go build -o oracle-cli
./oracle-cli -host=127.0.0.1 -port=1521 -username=sys -password=mypassword -serviceName=pdb1 -sql="SELECT * FROM mytable"

结语

通过本文的介绍和代码示例,我能可以快速开发一个用于访问 Oracle 数据库的命令行工具。该工具不仅能够连接到数据库,还支持执行简单的 SQL 查询,为数据库管理和调试提供了极大的便利。