Schnellstart: Mit der Programmiersprache Go eine Verbindung mit Azure Database for PostgreSQL – Flexible Server herstellen und Daten abfragen

In dieser Schnellstartanleitung erfahren Sie, wie Sie mit Code in der Sprache Go (golang) eine Verbindung mit einer Azure-Datenbank für PostgreSQL herstellen. Es wird veranschaulicht, wie Sie SQL-Anweisungen zum Abfragen, Einfügen, Aktualisieren und Löschen von Daten in der Datenbank verwenden. In diesem Artikel wird davon ausgegangen, dass Sie mit der Entwicklung in Go vertraut sind, aber sie sind neu bei der Arbeit mit Azure Database for PostgreSQL.

Voraussetzungen

In dieser Schnellstartanleitung werden die ressourcen verwendet, die in der Erstellung einer Azure-Datenbank für PostgreSQL als Ausgangspunkt erstellt wurden.

Von Bedeutung

Verwenden Sie einen Server mit aktiviertem öffentlichen Zugriff (zulässige IP-Adressen) für diese Schnellstartanleitung. Für die Durchführung dieses Schnellstarts mit einem Server mit aktiviertem privatem Zugriff (VNet-Integration) sind unter Umständen zusätzliche Schritte erforderlich, die hier nicht behandelt werden.

Stellen Sie sicher, dass die IP-Adresse, von der aus Sie eine Verbindung herstellen, den Firewallregeln des Servers mithilfe des Azure Portals oder Azure CLI hinzugefügt wird.

Installieren von Go und dem pq-Connector

Installieren Sie Go und den reinen Go-Postgres-Treiber (pq) auf Ihrem eigenen Computer. Führen Sie je nach Plattform die geeigneten Schritte aus:

  1. Laden Sie Go für Microsoft Windows herunter, und installieren Sie es gemäß der Installationsanleitung.

  2. Starten Sie die Eingabeaufforderung über das Startmenü.

  3. Erstellen Sie einen Ordner für Ihr Projekt, z. B. mkdir %USERPROFILE%\go\src\postgresqlgo.

  4. Wechseln Sie zum Projektordner. Beispiel: cd %USERPROFILE%\go\src\postgresqlgo.

  5. Legen Sie die Umgebungsvariable für GOPATH so fest, dass sie auf das Quellcodeverzeichnis verweist. set GOPATH=%USERPROFILE%\go.

  6. Führen Sie go mod init aus, um ein Modul im aktuellen Verzeichnis zu erstellen. Beispiel: go mod init postgresqlgo.

    • Der Parameter <module_path> ist im Allgemeinen ein Speicherort in einem GitHub-Repository, etwa github.com/<your_github_account_name>/<directory>.
    • Wenn Sie eine Befehlszeilen-App als Test erstellen und die App nicht veröffentlichen, muss <module_path> nicht auf einen tatsächlichen Speicherort verweisen. Beispiel: postgresqlgo.
  7. Installieren Sie den reinen Go-Postgres-Treiber (pq) durch Ausführen des Befehls go get github.com/lib/pq.

    Zusammenfassung: Installieren Sie Go, und führen Sie anschließend an der Eingabeaufforderung die folgenden Befehle aus:

    mkdir  %USERPROFILE%\go\src\postgresqlgo
    cd %USERPROFILE%\go\src\postgresqlgo
    set GOPATH=%USERPROFILE%\go
    go mod init postgresqlgo
    go get github.com/lib/pq
    

Abrufen von Verbindungsinformationen

Rufen Sie die Verbindungsinformationen ab, die zum Herstellen einer Verbindung mit der Azure-Datenbank für PostgreSQL erforderlich sind. Sie benötigen den vollqualifizierten Servernamen und die Authentifizierungsanmeldeinformationen.

  1. Melden Sie sich beim Azure-Portal an.
  2. Wählen Sie im linken Menü im Azure-Portal "Alle Ressourcen" aus, und suchen Sie dann nach dem server, den Sie erstellt haben (z. B. mydemoserver).
  3. Wählen Sie den Servernamen aus.
  4. Notieren Sie sich im Bereich Übersicht des Servers den Servernamen und den Anmeldenamen des Serveradministrators. Wenn Sie Ihr Kennwort vergessen haben, können Sie es in diesem Bereich auch zurücksetzen.

Erstellen und Ausführen von Go-Code

  1. Zum Schreiben von Go-Code verwenden Sie einen einfachen Texteditor, z. B. Notepad in Microsoft Windows, Nano in Ubuntu oder TextEdit in macOS. Wenn Sie eine umfangreichere interaktive Entwicklungsumgebung (IDE) bevorzugen, probieren Sie GoLand von JetBrains, Visual Studio Code von Microsoft oder Atom aus.
  2. Fügen Sie den Go-Code aus den folgenden Abschnitten in Textdateien ein, und speichern Sie ihn in Ihrem Projektordner mit der Dateierweiterung *.go, z. B. Windows Pfad %USERPROFILE%\go\src\postgresqlgo\createtable.go oder Linux-Pfad~/go/src/postgresqlgo/createtable.go.
  3. Suchen Sie im Code nach den Konstanten HOST, DATABASE, USER und PASSWORD, und ersetzen Sie die Beispielwerte durch Ihre eigenen Werte. Wenn Sie Ihren Azure Database for PostgreSQL-Server erstellen, erstellen Sie eine Datenbank mit dem Namen "Postgres". Sie können diese Datenbank oder eine andere Datenbank verwenden, die Sie erstellen.
  4. Starten Sie die Eingabeaufforderung oder die Bash-Shell. Wechseln Sie in das Verzeichnis Ihres Projektordners. Verwenden Sie cd %USERPROFILE%\go\src\postgresqlgo\z. B. auf Windows . Verwenden Sie cd ~/go/src/postgresqlgo/unter Linux . Einige der genannten IDE-Umgebungen bieten Debug- und Laufzeitfunktionen ohne Shell-Befehle.
  5. Geben Sie den Befehl go run createtable.go ein, um den Code auszuführen und die Anwendung zu kompilieren und auszuführen.
  6. Alternativ können Sie den Code mit go build createtable.go in eine systemeigene Anwendung umwandeln. Starten Sie createtable.exe dann, um die Anwendung auszuführen.

Herstellen einer Verbindung und Erstellen einer Tabelle

Verwenden Sie den folgenden Code, um eine Tabelle mithilfe der CREATE TABLE SQL-Anweisung zu verbinden und zu erstellen, gefolgt von INSERT INTO SQL-Anweisungen, um zeilen zur Tabelle hinzuzufügen.

Der Code importiert drei Pakete: das sql-Paket, das pq-Paket als Treiber für die Kommunikation mit dem PostgresSQL-Server und das fmt-Paket für die Ein- und Ausgabe in der Befehlszeile.

Der Code ruft die Methode sql.Open() auf, um eine Verbindung mit der Datenbank Azure Database for PostgreSQL herzustellen, und überprüft die Verbindung mithilfe der Methode db.Ping(). Ein Datenbankhandle wird durchgängig für den Verbindungspool des Datenbankservers eingesetzt. Im Code wird die Exec()-Methode mehrfach aufgerufen, um mehrere SQL-Befehle auszuführen. Jedes Mal prüft eine benutzerdefinierte Methode checkError(), ob ein Fehler aufgetreten ist, und löst einen Panic aus, um die Ausführung zu beenden, wenn ein Fehler vorliegt.

Ersetzen Sie die Parameter HOST, DATABASE, USER und PASSWORD durch Ihre eigenen Werte.

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {
	// Initialize connection string.
	var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

	// Initialize connection object.
	db, err := sql.Open("postgres", connectionString)
	checkError(err)

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database")

	// Drop previous table of same name if one exists.
	_, err = db.Exec("DROP TABLE IF EXISTS inventory;")
	checkError(err)
	fmt.Println("Finished dropping table (if existed)")

	// Create table.
	_, err = db.Exec("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
	checkError(err)
	fmt.Println("Finished creating table")

	// Insert some data into table.
	sql_statement := "INSERT INTO inventory (name, quantity) VALUES ($1, $2);"
	_, err = db.Exec(sql_statement, "banana", 150)
	checkError(err)
	_, err = db.Exec(sql_statement, "orange", 154)
	checkError(err)
	_, err = db.Exec(sql_statement, "apple", 100)
	checkError(err)
	fmt.Println("Inserted 3 rows of data")
}

Daten lesen

Verwenden Sie den folgenden Code, um die Daten mit einer SQL-Anweisung des Typs SELECT zu verbinden und zu lesen.

Der Code importiert drei Pakete: das sql-Paket, das pq-Paket als Treiber für die Kommunikation mit dem PostgresSQL-Server und das fmt-Paket für die Ein- und Ausgabe in der Befehlszeile.

Der Code ruft die Methode sql.Open() auf, um eine Verbindung mit der Azure Database for PostgreSQL-Datenbank herzustellen, und überprüft die Verbindung mithilfe der Methode db.Ping(). Ein Datenbankhandle wird durchgängig für den Verbindungspool des Datenbankservers eingesetzt. Die Auswahlabfrage wird durch Aufrufen der Methoden db ausgeführt. Query() und die resultierenden Zeilen werden in einer Variablen vom Typ "Rows" gespeichert. Der Code liest die Spaltenwerte in der aktuellen Zeile mithilfe der Methode rows.Scan() und durchläuft die Zeilen mithilfe des Iterators rows.Next(), bis keine weiteren Zeilen mehr vorhanden sind. Die Spaltenwerte jeder Zeile werden in der Konsole ausgegeben. Jedes Mal, wenn eine benutzerdefinierte checkError()-Methode verwendet wird, um zu überprüfen, ob ein Fehler aufgetreten ist, und Panik, um zu beenden, wenn ein Fehler auftritt.

Ersetzen Sie die Parameter HOST, DATABASE, USER und PASSWORD durch Ihre eigenen Werte.

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

	// Initialize connection object.
	db, err := sql.Open("postgres", connectionString)
	checkError(err)

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database")

	// Read rows from table.
	var id int
	var name string
	var quantity int

	sql_statement := "SELECT * from inventory;"
	rows, err := db.Query(sql_statement)
	checkError(err)
	defer rows.Close()

	for rows.Next() {
		switch err := rows.Scan(&id, &name, &quantity); err {
		case sql.ErrNoRows:
			fmt.Println("No rows were returned")
		case nil:
			fmt.Printf("Data row = (%d, %s, %d)\n", id, name, quantity)
		default:
			checkError(err)
		}
	}
}

Aktualisieren von Daten

Verwenden Sie den folgenden Code, um die Daten mit einer SQL-Anweisung des Typs UPDATE zu verbinden und zu aktualisieren.

Der Code importiert drei Pakete: das sql-Paket, das pq-Paket als Treiber für die Kommunikation mit dem Postgres-Server und das fmt-Paket für die Ein- und Ausgabe in der Befehlszeile.

Der Code ruft die Methode sql.Open() auf, um eine Verbindung mit der Azure Database for PostgreSQL-Datenbank herzustellen, und überprüft die Verbindung mithilfe der Methode db.Ping(). Ein Datenbankhandle wird durchgängig für den Verbindungspool des Datenbankservers eingesetzt. Im Code wird die Exec()-Methode aufgerufen, um die SQL-Anweisung auszuführen, mit der die Tabelle aktualisiert wird. Eine benutzerdefinierte checkError()-Methode wird verwendet, um das Auftreten eines Fehlers zu überprüfen, und der Vorgang wird beendet, falls dies der Fall ist.

Ersetzen Sie die Parameter HOST, DATABASE, USER und PASSWORD durch Ihre eigenen Werte.

package main

import (
  "database/sql"
  _ "github.com/lib/pq"
  "fmt"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString string = 
		fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

	// Initialize connection object.
	db, err := sql.Open("postgres", connectionString)
	checkError(err)

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database")

	// Modify some data in table.
	sql_statement := "UPDATE inventory SET quantity = $2 WHERE name = $1;"
	_, err = db.Exec(sql_statement, "banana", 200)
	checkError(err)
	fmt.Println("Updated 1 row of data")
}

Löschen von Daten

Verwenden Sie den folgenden Code, um eine Verbindung mit der Datenbank herzustellen und Daten mithilfe einer DELETE SQL-Anweisung zu löschen.

Der Code importiert drei Pakete: das sql-Paket, das pq-Paket als Treiber für die Kommunikation mit dem Postgres-Server und das fmt-Paket für die Ein- und Ausgabe in der Befehlszeile.

Der Code ruft die Methode sql.Open() auf, um eine Verbindung mit Azure Database for PostgreSQL herzustellen, und prüft die Verbindung mit der Methode db.Ping(). Ein Datenbankhandle enthält den Verbindungspool für den Datenbankserver und wird überall verwendet. Im Code wird die Exec()-Methode aufgerufen, um die SQL-Anweisung auszuführen, die eine Zeile aus der Tabelle löscht. Eine benutzerdefinierte checkError() Methode überprüft, ob ein Fehler aufgetreten ist und beendet wird, wenn ein Fehler auftritt.

Ersetzen Sie die Parameter HOST, DATABASE, USER und PASSWORD durch Ihre eigenen Werte.

package main

import (
  "database/sql"
  _ "github.com/lib/pq"
  "fmt"
)

const (
	// Initialize connection constants.
	HOST     = "mydemoserver.postgres.database.azure.com"
	DATABASE = "postgres"
	USER     = "mylogin"
	PASSWORD = "<server_admin_password>"
)

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

func main() {

	// Initialize connection string.
	var connectionString string = 
		fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)

	// Initialize connection object.
	db, err := sql.Open("postgres", connectionString)
	checkError(err)

	err = db.Ping()
	checkError(err)
	fmt.Println("Successfully created connection to database")

	// Delete some data from table.
	sql_statement := "DELETE FROM inventory WHERE name = $1;"
	_, err = db.Exec(sql_statement, "orange")
	checkError(err)
	fmt.Println("Deleted 1 row of data")
}

Bereinigen von Ressourcen

Um alle während dieser Schnellstartanleitung verwendeten Ressourcen zu bereinigen, löschen Sie die Ressourcengruppe mithilfe des folgenden Befehls:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes