web-dev-qa-db-fra.com

Golang comment ouvrir une connexion mysql à distance?

J'essaie de me connecter à la base de données mysql distante à l'aide de go et du package database/sql. Je trouve la documentation go/mysql déroutante. Il semble qu'il n'y ait pas un seul exemple de connexion à un hôte distant. Comme tout le monde utiliserait localhost. Jusqu'ici j'ai cette

   import (
        "database/sql"
        _ "github.com/ziutek/mymysql/godrv"    
        db, err := sql.Open("mymysql", "tcp:"+dbHost*dbName+"/"+user+"/"+pass)
        defer db.Close()

Basé sur la documentation de https://github.com/ziutek/mymysql

[PROTOCOL_SPECFIIC*]DBNAME/USER/PASSWD
//
// where protocol specific part may be empty (this means connection to
// local server using default protocol). Currently possible forms:
//   DBNAME/USER/PASSWD
//   unix:SOCKPATH*DBNAME/USER/PASSWD
//   unix:SOCKPATH,OPTIONS*DBNAME/USER/PASSWD
//   tcp:ADDR*DBNAME/USER/PASSWD
//   tcp:ADDR,OPTIONS*DBNAME/USER/PASSWD

J'ai aussi essayé

 db, err := sql.Open("mymysql", "tcp:"+dbHost, dbName+"/"+user+"/"+pass) 

et ça ne marche pas non plus. La syntaxe entière semble cryptique.

13

Ces sites sont très utiles pour comprendre Go SQL: https://github.com/go-sql-driver/mysql/ (même si vous utilisez un pilote différent) et http: // go- database-sql.org/

Il y a quelques choses qui pourraient aider:

  1. La chaîne de connexion pour sql.Open() est au format DSN. db, err := sql.Open("mysql", "<username>:<pw>@tcp(<Host>:<port>)/<dbname>") travaille pour moi pour mes relations. Vérifiez l’utilisation de parenthèses pour les connexions TCP.
  2. Le pilote que vous utilisez a la commande mysql.New() qui peut ouvrir des connexions en utilisant le format indiqué précédemment: db := mysql.New(proto, "", addr, user, pass, dbname) (voir https://github.com/ziutek/mymysql/blob/master/examples/simple.go )
  3. De manière confuse, sql.Open n'ouvre pas réellement de connexion, il crée simplement une ressource de base de données. Vous pouvez vérifier que cela fonctionne en exécutant db.Ping()
25
dethtron5000

La déclaration suivante fonctionne pour moi:

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

db, err := sql.Open("mysql", "db_user:password@tcp(localhost:3306)/my_db")

)

1
user2712873