2016-08-07 19 views
2

In Code, der Datenbank Agnostiker sein will, würde Ich mag einige Datenbank spezifische Abfragen auszuführen, also muss ich Namen von Datenbank-Treiber in Go Sprache wissen:Wie kann ich den Namen des Datenbanktreibers ermitteln, den ich verwende?

db,err := sql.Open(dbstr, dbconnstr) 
    if err != nil { 
      log.Fatal(err) 
    } 
    errp := db.Ping() 
    if errp != nil { 
      log.Fatal(errp) 
    } 
    log.Printf("%s\n", db.Driver()) 

Wie ich Namen von Datenbanktreiber ich feststellen kann, benutze ich?

Antwort

2

Geben Sie Ihre Datenbank-Zeichenfolge im URL-Format wie postgres://[email protected]:5432/db_name?sslmode=disable.

Und dann finden Sie den Datenbanktyp Sie Parse Funktion des URL-Pakets verwenden. Führen Sie basierend auf dem Datenbanktyp db-spezifische Abfragen aus.

func New(url string) (Driver, error) { 
    u, err := neturl.Parse(url) 
    if err != nil { 
     return nil, err 
    } 

    switch u.Scheme { 
    case "postgres": 
     d := &postgres.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "mysql": 
     d := &mysql.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "bash": 
     d := &bash.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "cassandra": 
     d := &cassandra.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 
    case "sqlite3": 
     d := &sqlite3.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 
    default: 
     return nil, errors.New(fmt.Sprintf("Driver '%s' not found.", u.Scheme)) 
    } 
} 
0

Sie sollten bereits den Namen des Datenbanktreibers kennen, weil sein durch den Parameter, den Sie mit dem dbstr Variable identifiziert dargestellt.

db, err := sql.Open("postgres", "user= ... ") 
if err != nil { 
    log.Fatal(err) 
} 

db.Driver() korrekt liefert die zugrunde liegenden Treiber im Einsatz, aber Sie formatieren sie als string (wegen %s). Wenn Sie %s mit %T ändern, werden Sie sehen, dass es richtig die Art druckt:

log.Printf("%T\n", db.Driver()) 

Zum Beispiel, wenn Sie github.com/lib/pq verwenden, ist der Ausgang *pq.drv. Dies ist das gleiche für die Verwendung des reflect Pakets:

log.Printf("%s\n", reflect.TypeOf(db.Driver())) 

Es kann unpraktisch sein, diesen Wert zu verwenden, für die Durchführung bedingte Ausführungen. Darüber hinaus gibt die Schnittstelle Driver keine Möglichkeit an, die spezifischen Treiberinformationen abzurufen, mit Ausnahme der Open()-Funktion.

Wenn Sie bestimmte Anforderungen haben, können Sie entweder den beim Öffnen der Verbindung übergebenen Treibernamen verwenden oder spezifische Treiber erstellen, die an die ursprünglichen delegieren und mit Ihrer benutzerdefinierten Logik umgehen.