У меня есть код, который работает на локальном сервере 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
Я боролся с этим уже час, и я, вероятно, делаю что-то очень глупое, любая помощь будет оценена по достоинству!
"github.com/go-sql-driver/mysql"
) или драйвер mymysql ("github.com/ziutek/mymysql/godrv"
)? - person icza   schedule 15.08.2016root
, а идентификатор проекта и имя экземпляра верны? - person icza   schedule 15.08.2016sql.Open()
просто проверяет свои аргументы, но не открывает соединение. Для этого вы можете использоватьDB.Ping()
. Подробнее см. в этом ответе: Почему sql.Open() возвращает nil как ошибку, хотя этого не должно быть? - person icza   schedule 16.08.2016