【问题标题】:google app engine golang, driver: bad connection谷歌应用引擎golang,驱动程序:连接不良
【发布时间】:2016-12-21 17:39:31
【问题描述】:

我有一些在本地 GAE 服务器上运行的代码,但是一旦我将它发布到 GAE,它就会抛出错误“驱动程序:连接错误”。

以下代码生成一个新的*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 驱动程序 ("github.com/ziutek/mymysql/godrv")?
  • github.com/go-sql‌​-driver/mysql,我是否需要在 GAE 中使用 github.com/ziutek‌​/mymysql/godrv?
  • 不,两者都适用于 Cloud SQL,但它们需要不同的语法来定义数据源。但是你的看起来不错,你确定用户是root,并且项目 id 和实例名称是正确的吗?
  • 是的,目前只有用户是 root 用户(我使用本地 GAE 服务器通过 IP 连接到 Cloud SQL 实例,它工作正常)并多次检查项目 ID/实例名称,它们是相同的,所以我看不出这是问题所在。
  • 您的应用和 Cloud SQL 实例是否在同一个区域?您是否已授予您的应用访问 SQL 实例的权限?

标签: mysql google-app-engine go


【解决方案1】:

我最终需要更改我的 dbcloud 变量以包含 SQL 服务器的更改区域:

'projectid:instancename'

收件人:

'projectid:regionname:instancename'

不知道为什么我需要这样做,因为它不在 https://github.com/go-sql-driver/mysql 的文档中,但现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2017-03-15
    • 2012-08-13
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多