2016-03-03 32 views
0

我觉得我必须完全忽略这一点。 我尝试运行沿着下面的例子线的东西,但?没有扩展到传入的参数。golang mysql exec占位符“?”没有扩大

import (
    "database/sql" 
    _ "github.com/go-sql-driver/mysql" 
) 

db, err := sql.Open(...) 
if err != nil { ... } 
_, err = db.Query("SELECT * FROM foo WHERE bar=?", bar) 

而且,谁的担忧正在扩大呢?它显示在database/sqldoc,但其他对话暗示它可能是司机的关注。

我错过了什么?任何指针在正确的方向非常赞赏。

回答

0

你(可能)不告诉它使用mysql驱动程序;

db, err := sql.Open("mysql", connString) 

下面是我的一些示例代码:

var query = "INSERT IGNORE INTO blah (`col1`, `col2`, `col3`) VALUES (?, ?, ?)" 

r, err := db.Query(query, some_data_1, some_data_2, some_data_3) 

// Failure when trying to store data 
if err != nil { 
    msg := fmt.Sprintf("fail : %s", err.Error()) 
    fmt.Println(msg) 

    return err 
} 

r.Close() // Always do this or you will leak connections 

我创建MySQL池(是的,这是一个游泳池一个接头):

import (
    // mysql driver 
    _ "github.com/go-sql-driver/mysql" 

    "database/sql" 
    "fmt" 
) 

connString := fmt.Sprintf("%s:%[email protected](%s:%d)/%s?timeout=30s", 
    user, 
    password, 
    host, 
    port, 
    database, 
) 

db, err := sql.Open("mysql", connString) 

if err != nil { 
    return nil, err 
} 

err = db.Ping() // test the pool connection(s) 

if err != nil { 
    return nil, err 
} 

return db, nil // No error, return the pool connections 

我也强烈建议您打印出数据库连接过程和查询过程中的任何错误。这可能是因为您使用的是驱动程序,但您缺少权限,数据库已关闭等。

+1

感谢您的努力jersten。我很困惑它是否应该起作用,你帮助解决了这个模棱两可的问题,因此我接受了答案。我没有发表一个非常透彻的问题,事实上,我的问题并没有包含这个问题。事实证明,我也想传递表名,这似乎不被支持。我为所有人提供了一个完整的工作示例。再次感谢! https://play.golang.org/p/VHTB2zddjl – zupa