google app engine golang, драйвер: лоша връзка

Имам някакъв код, който работи на локалния 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

Вече един час се боря с това и вероятно правя нещо много глупаво. Всяка помощ ще бъде оценена!


person lflahive    schedule 15.08.2016    source източник
comment
Използвате ли go-sql-driver ("github.com/go-sql-driver/mysql") или mymysql driver ("github.com/ziutek/mymysql/godrv")?   -  person icza    schedule 15.08.2016
comment
github.com/go-sql‌​-driver/mysql, трябва ли да използвам github.com/ziutek‌​/mymysql/godrv с GAE?   -  person lflahive    schedule 15.08.2016
comment
Не, и двете работят добре с Cloud SQL, но изискват различен синтаксис за дефиниране на източника на данни. Вашият обаче изглежда добре, сигурни ли сте, че потребителят е root и че идентификаторът на проекта и името на екземпляра са правилни?   -  person icza    schedule 15.08.2016
comment
Да, в момента само потребителят е root (свързвам се с екземпляра на Cloud SQL чрез IP, използвайки локалния GAE сървър и работи добре) и проверих идентификатора на проекта / името на екземпляра няколко пъти, те са идентични, така че не виждам, че това е проблем.   -  person lflahive    schedule 15.08.2016
comment
Вашето приложение и екземпляр на Cloud SQL в един и същи регион ли са? Дали ли сте на приложението си достъп до екземпляра на SQL?   -  person icza    schedule 15.08.2016
comment
Да, и двете са централни за нас и са в един и същ проект, така че имат достъп по подразбиране, смятам, че излизат от контрола на достъпа на екземпляра на SQL: Разрешение на App Engine Всички приложения в този проект са оторизирани по подразбиране. За да разрешите приложения в други проекти, следвайте стъпките по-долу.   -  person lflahive    schedule 15.08.2016
comment
Вижте тази страница как да предоставите достъп: Свързване от Google App Engine ( забележка: различни стъпки за инстанции от първо и второ поколение).   -  person icza    schedule 15.08.2016
comment
Да, видях, че преди да попитам тук, в момента използвам Gen 2, като първата стъпка е: Ако вашето приложение е в същия проект като вашия екземпляр на Cloud SQL, можете да продължите към стъпка 2. която просто ви дава кода за връзка? Единственото нещо, което не разбирам е, че sql.Open не предизвиква грешка, но опитът да се използва db след това го прави?   -  person lflahive    schedule 16.08.2016
comment
Това е нормално. sql.Open() само проверява своите аргументи, но не отваря връзка. За това можете да използвате DB.Ping(). Вижте този отговор за подробности: Защо sql.Open() връща нула като грешка, когато не трябва?   -  person icza    schedule 16.08.2016
comment
Хей @icza намериха проблема! Трябваше да променя моята dbcloud env_variable, за да включва моя регион, въпреки че и двата са в us_central? И така, сега става 'projectid:regionname:instancename' и работи... Благодаря ви много за отделеното време, въпреки че това беше просто моя глупава грешка!   -  person lflahive    schedule 16.08.2016
comment
Радвам се, че реши проблема си. Моля, публикувайте вашето решение като отговор, за да могат другите да се възползват от него.   -  person icza    schedule 16.08.2016


Отговори (1)


В крайна сметка трябваше да променя променливата си dbcloud, за да включва региона на SQL сървъра, променяйки го от:

'projectid:instancename'

To:

'projectid:regionname:instancename'

Нямам представа защо трябва да правя това, тъй като не е в документите на https://github.com/go-sql-driver/mysql, но вече всичко работи!

person lflahive    schedule 16.08.2016