[gogf/gf]oracle驱动连接字符串解析错误

2024-07-09 273 views
2

go version go1.17.5 darwin/amd64

github.com/gogf/gf/v2 v2.0.0-rc.0.20220104132444-99455e328b35

import _ "github.com/sijms/go-ora/v2" 1.然后覆盖oracle驱动 2.连接字符串格式: conn, err := sql.Open("oracle", "oracle://user:pass@host:port/db_name") 3.随便执行一条查询,或者ping() 这时候会发现解析连接字符串的结果是错误的!目测是对”:“的判断处理有问题。

希望能正确解析连接字符串。另外,如下两处的代码,硬编码不统一: driverMap = map[string]Driver{ "mysql": &DriverMysql{}, "mssql": &DriverMssql{}, "pgsql": &DriverPgsql{}, "oracle": &DriverOracle{}, // 这里使用了oracle "sqlite": &DriverSqlite{}, } func (d DriverOracle) Open(config ConfigNode) (db *sql.DB, err error) { var ( source string driver = "oci8" //这里使用了oci8 ) if config.Link != "" { source = config.Link } else { source = fmt.Sprintf( "%s/%s@%s:%s/%s", config.User, config.Pass, config.Host, config.Port, config.Name, ) } intlog.Printf(d.GetCtx(), "Open: %s", source) if db, err = sql.Open(driver, source); err != nil { err = gerror.WrapCodef( gcode.CodeDbOperationError, err, sql.Open failed for driver "%s" by source "%s", driver, source, ) return nil, err } return }

回答

7

硬编码那块不冲突,上层是使用oracle,下层driver可以替换,上层名称确定之后不能变

7

如果你想更换ora,可能需要自己写一个驱动,重新注册覆盖一下

4

需要修改2个地方:

  1. gdb_driver_oracle.go
    func (d *DriverOracle) Open(config *ConfigNode) (*sql.DB, error) {
    var source string
    if config.Link != "" {
        source = config.Link
    } else {
        source = fmt.Sprintf(
            "%s/%s@%s:%s/%s",
            config.User, config.Pass, config.Host, config.Port, config.Name,
        )
    }
    intlog.Printf(d.GetCtx(), "Open: %s", source)
    if db, err := sql.Open(config.Type, source); err == nil {
        return db, nil
    } else {
        return nil, err
    }
    }

    sql.Open中修改为config.Type。

source = fmt.Sprintf(
            "%s/%s@%s:%s/%s",
            config.User, config.Pass, config.Host, config.Port, config.Name,

source这块可以根据不同驱动的连接串修改,也可以直接用config.Link

  1. gdb.go
    driverMap = map[string]Driver{
        "mysql":  &DriverMysql{},
        "mssql":  &DriverMssql{},
        "pgsql":  &DriverPgsql{},
        "oracle": &DriverOracle{},
        "sqlite": &DriverSqlite{},
                "oci8": &DriverOracle{},
    }

    新增一个oci8,这样就支持了2个驱动

2

驱动覆盖是成功的,新驱动的Open方法里的连接字符串格式也按照新驱动要求的格式重写了。 现在的问题是:执行sql语句的时候,执行到Open方法时,是没问题的,没有err返回,但是MasterPing方法执行会提示错误,导致错误的是解析出来的连接字符串被截断了。 覆盖一下驱动,运行一个简单的查询就能重现错误的。

1

出错原因是:密码里带有#号, 解决办法:覆盖Open方法时,使用驱动提供的rul构造器

            urlOptions := map[string]string{
        "trace file": "trace.log",
    }
    source = ora.BuildUrl(config.Host, gconv.Int(config.Port), config.Name, config.User, config.Pass, urlOptions)