2016-07-04 6 views
1

Ich benutze eine MySQL-Datenbank und habe viele verschiedene Funktionen/Methoden, die mit der Datenbank interagieren. Für jede Funktion muss ich offcourse wieGolang Wie kann ich eine Dependency Injection tun, um einige String-Werte zu speichern

ReadAll.go

func ReadAll() { 
    db, err := sql.Open("mysql", 
     "user:[email protected](127.0.0.1:3306)/hello") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer db.Close() 
} 

Der Teil der "mysql", „Benutzer die Datenbank-Anmeldeinformationen liefern: Passwort @ tcp (127.0.0.1:3306)/hallo " ändert sich nie und ich liefere das an jede Funktion, die mit DB interagiert. Ich frage mich, wie kann ich zum Beispiel eine neue Datei erstellen say DataBase.go diese Anmeldeinformationen in einige globale Variable setzen und dann verweisen, wenn ich diese Zeichenfolgen brauche? Wenn ich die Anmeldedaten ändern muss, muss ich sie nur an einer Stelle ändern. Ich möchte wie etwas tun

Database.go

const GlobalDB := "mysql","user:[email protected](127.0.0.1:3306)/hello" 

dann

ReadAll.go

func ReadAll() { 
    db, err := sql.Open(GlobalDB) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer db.Close() 
} 

ich Golang ganz neu bin aber versuchen, um dies herauszufinden .

+0

See aussehen kann [Go Datenbank/SQL-Tutorial] (http://go-database-sql.org/index .html) – Mark

Antwort

2

Ich würde das wahrscheinlich tun, indem ich einmal eine Sitzung für die Datenbank öffne, und dann diese Sitzung an irgendeine Funktion oder Methode weitergeben, die sie brauchen könnte. Dies hat einige mögliche Probleme:

  • Unter Umständen müssen Sie den Zugriff darauf sperren, so dass Sie nicht mehrere Anfragen auf der gleichen Sitzung zusammen mischen (aber es kann sein, dass Ihre DB-Bibliothek gewährleistet diese, FWIW " database/sql "ist nebenläufigkeitssicher und empfiehlt, KEINE kurzlebigen Datenbankverbindungen zu öffnen."
  • Sie können die Sitzung nicht sicher schließen, da sie möglicherweise noch an einem anderen Ort verwendet wird.

Eine andere Möglichkeit wäre, eine Funktion zu haben, die eine DB sesssion zurückkehrt, so zu tun, anstatt:

db, err := sql.Open("mysql", "user:[email protected](127.0.0.1:3306)/hello") 

Sie wie folgt vor:

func dbSession() (sql.DB, error) { 
    return sql.Open("mysql", "credentials") 
} 

func ReadAll() { 
    db, err := dbSession() 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer db.Close() 
} 

Und wenn Sie noch mehr wollen Flexibilität, Sie können eine Struktur haben, die die Daten enthält, die Sie benötigen, und dann Ihre DB-Verbindungsparameter daraus erstellen.

type dbData struct { 
    DBType, DBName, User, Host, Password string 
} 
var DBData dbData 

func dbSession() (*sql.DB, error) { 
    return sql.Open(DBData.DBType, fmt.Sprintf("%s:%[email protected](%s)/%s", DBData.User, DBData.Password, DBData.Host, DBData.DBName) 
} 

Beachten Sie auch die folgenden in der Dokumentation von sql.Open:

Der zurück DB ist für die gleichzeitige Nutzung durch mehrere goroutines sicher und unterhält einen eigenen Pool von Verbindungen im Leerlauf. Daher sollte die Open-Funktion nur einmal aufgerufen werden. Es ist selten notwendig, eine DB zu schließen.

0

Sie können leicht eine neue Datei mit Ihren Anmeldeinformationen erstellen. Lassen Sie die Datei einfach im Hauptpaket enthalten.

package main 

var myDBConnectionString := "mysql://...." 

Dies wird bei der Kompilierung der Quelle berücksichtigt.

Das Problem ist, dass Sie Ihren Code jedes Mal neu kompilieren müssen, wenn Sie eine Verbindung zu einer anderen Datenbank herstellen müssen. Denken Sie über ein Entwicklungssystem vs. Produktionssystem nach. Die Datenbankanmeldeinformationen sollten in diesen Systemen abweichen, oder? :)

Um dies zu beheben, ist es üblich, eine Konfigurationsdatei zu haben. So können Sie die Anmeldeinformationen ändern, ohne den Code neu kompilieren zu müssen.

Ich habe eine andere Idee - einfach einmal mit der Datenbank verbinden und global auf diese Ressource zugreifen. Paket Haupt

import (
    "fmt" 
) 

var myDb = "example" 

func main() { 
    fmt.Println("Hello, playground") 
    doSomthingWithDatabase() 
} 

func doSomthingWithDatabase() { 
    fmt.Println("We can access a global variable here, see", myDb) 
} 

https://play.golang.org/p/npZ6Z49ink

Für die Konfiguration Umgang Sie hier https://blog.gopheracademy.com/advent-2014/reading-config-files-the-go-way/