【问题标题】:Why is it failing to connect with oracle Autonomous Database from golang?为什么无法从 golang 连接到 oracle 自治数据库?
【发布时间】:2023-01-11 17:13:07
【问题描述】:
    dsn := `
user=ADMIN,
password=temp1!a,
(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-seoul-1.oraclecloud.com))(connect_data=(service_name=gee9edfb93f3cf6_redglqweyxqefhhf_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-seoul-1.oraclecloud.com, OU=Oracle ADB SEOUL, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))
`

db, err := sql.Open("godror", dsn)
if err != nil {
    fmt.Println(err)
    return
}
defer db.Close()

我创建了一个自治数据库,我尝试用golang上面的代码连接,但是连接不上,报如下错误,怎么连接,我找不到详细的手册,你能帮帮我吗?

go run main.go
parsing parameters "user=ADMIN,\n\tpassword=temp1!a,\n\t(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-seoul-1.oraclecloud.com))(connect_data=(service_name=gee9edfb93f3cf6_redglqweyxqefhhf_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn=\"CN=adb.ap-seoul-1.oraclecloud.com, OU=Oracle ADB SEOUL, O=Oracle Corporation, L=Redwood City, ST=California, C=US\")))": logfmt syntax error at pos 44 on line 3: unexpected '='

【问题讨论】:

  • dsn格式不对。
  • 连接参数应放入connectString 键:参见pkg.go.dev/github.com/godror/godror#readme-connection。还请验证是否可以正确解析逗号,因为它们在文档中不存在
  • db, error := sql.Open("godror", `user="scott" password="tiger" connectString="dbhost:1521/orclpdb1" 我检查了这部分,connectString 中应该缺少什么部分?
  • Oracle的db信息不需要输入吗?我如何在 oracle 中连接到我的数据库?
  • 基于云的 Oracle ADB 需要使用带有证书的 Oracle 钱包来支持 TCPS 协议:您应该使用 TNSNAMES 连接别名,以及 Oracle 提供的所有连接规范。另外,请告诉我你没有发布实际的连接数据,用户名和密码,在你原来的问题...

标签: oracle go oracle-autonomous-db


【解决方案1】:

我是oracle和golang的新用户,一切都是新的,很难找到连接oracle和golang的文档。有说明书,不过没看懂。

如果您在 stackoverflow 上发布问题,答案只是指向手册的链接。新手体验新环境真的很难

我终于找到了解决方案,我的代码如下。即使您不理解代码,也可以一边看示例一边逐一思考。

package main

import (
    "database/sql"
    "fmt"

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

type DbInfo struct {
    Username string
    Password string
}

func main() {
    serverInfo := DbInfo{
        Username: "databaseUser",
        Password: "databaseUserPassword",
    }
    urlOptions := map[string]string{
        "TRACE FILE": "trace.log",
        "SSL VERIFY": "FALSE",
    }
    connectString := "(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-seoul-1.oraclecloud.com))(connect_data=(service_name=gvsd1dfc9c3cdf6_racc7y8cxsvb16f0z_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))"

    db, err := sql.Open("oracle", go_ora.BuildJDBC(serverInfo.Username, serverInfo.Password, connectString, urlOptions))

    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    r, err := db.Exec(`create table users (
        nickname varchar(20)
    )`)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(r.LastInsertId())
}

上面的代码不需要钱包来进行 tls 访问。我也会在下面上传如何通过钱包访问它,以供需要它的初学者使用。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多