谷歌应用引擎Golang驱动程序:连接不良

3

我有一些代码在本地GAE服务器上运行良好,但一旦我将其发布到GAE上,它会抛出“driver: bad connection”的错误。

以下代码生成一个新的*sql.DB:

func NewDb() (*sql.DB, error) {
  cloud := os.Getenv("dbcloud")
  local := os.Getenv("dblocal")
  if appengine.IsDevAppServer() {
    return sql.Open("mysql", "root@tcp("+local+":3306)/dbo")
  }
  return sql.Open("mysql", "root@cloudsql("+cloud+")/dbo")
}

在我的app.yaml文件中,我有以下内容:
env_variables:
  dbcloud: 'projectid:instancename'
  dblocal: 'xxx.xxx.xxx.xxx'

看起来它可以正确返回一个新的 *sql.DB,但一旦我开始使用预处理语句时就会出现问题。

db, err := NewDb() // err is nil
stmt, err := db.Prepare("INSERT INTO dbo.Users (Id) VALUES (?)") // err is driver: bad connection

我已经在为这个问题挣扎了一个小时,可能是我做了什么很愚蠢的事情,请帮忙解决!


你在使用 go-sql-driver ("github.com/go-sql-driver/mysql") 还是 mymysql driver ("github.com/ziutek/mymysql/godrv")? - icza
不,两者都可以很好地与Cloud SQL配合使用,但它们需要不同的语法来定义数据源。您的看起来很好,但是您确定用户是“root”,项目ID和实例名称是否正确吗? - icza
请参考此页面:从Google App Engine连接(注意:针对第一代和第二代实例有不同的步骤)。 - icza
嘿@icza,我找到了问题所在!我需要更改我的dbcloud env_variable以包括我的区域,即使它们都在us_central?所以现在它变成了“projectid:regionname:instancename”,并且可以工作了...非常感谢您的时间,尽管这只是我的一个愚蠢错误! - lflahive
很高兴你解决了问题。请将您的解决方案发布为答案,以便其他人也可以受益。 - icza
显示剩余6条评论
1个回答

3

我最终需要更改我的dbcloud变量,以包括SQL服务器所在的地区,将其从以下内容更改:

'projectid:instancename'

致:

'projectid:regionname:instancename'

不知道为什么要这样做,因为https://github.com/go-sql-driver/mysql的文档中没有提到,但现在一切都正常了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接