【发布时间】:2018-09-14 23:45:06
【问题描述】:
我的 sql 查询需要变量替换以更好地使用我的 go-kit 服务。
我有 dep 和 org 作为用户输入,它们是我的休息服务的一部分,例如:dep = 'abc' 和 org = 'def'。
我尝试了一些类似的方法:
rows, err := db.Query(
"select name from table where department='&dep' and organisation='&org'",
)
还有:
rows, err := db.Query(
"select name from table where department=? and organisation=?", dep , org,
)
导致错误:sql: statement expects 0 inputs; got 2
只有硬编码的值有效,替换失败。
我没有从 oracle 博客中找到关于此问题的太多帮助,我想知道是否有任何方法可以解决此问题。
【问题讨论】:
-
正确的方法是
db.Query()或db.Prepare()和stmt.Exec()。但是db.Query()不只返回错误,你的驱动程序是什么?请提供带有db变量创建的代码示例。参考:golang.org/pkg/database/sql/#DB.Query -
这是我的 ora 驱动程序 - github.com/mattn/go-oci8
-
func NewOracleConnection(cfg config.Config, log log.Logger) (Connection, error) { var err error o := &Oracle{ Driver: cfg.DB.Driver, ConnectString: cfg.DB.ConnectString , logger: log, } o.Db, err = sql.Open(o.Driver, o.ConnectString) if err != nil { log.Log("event", "connecting to database", "err", err.错误())}返回o,错误}
-
我试过 db.query & Exec。有趣的是 sqlplus 客户端对于具有变量替换的相同查询可以正常工作,但此驱动程序失败
-
对于该驱动程序,它似乎是
:N(github.com/mattn/go-oci8/blob/master/oci8Sql_test.go#L1149) 其中N是参数的位置。所以在你的情况下,这样的事情应该可以工作:db.Query("select name from table where department = :1 and organisation = :2", dep, org)