Ziele
In dieser Anleitung werden die folgenden Schritte mit der Spanner-Clientbibliothek für Go beschrieben:
- Spanner-Instanz und -Datenbank erstellen
- SQL-Abfragen für Daten in der Datenbank schreiben, lesen und ausführen
- Datenbankschema aktualisieren
- Daten mit einer Lese-Schreib-Transaktion aktualisieren
- Sekundären Index für die Datenbank hinzufügen
- Mit dem Index Daten lesen und SQL-Abfragen ausführen
- Daten über eine schreibgeschützte Transaktion abrufen
Kosten
In dieser Anleitung wird Cloud Spanner verwendet, eine kostenpflichtige Komponente vonGoogle Cloud. Informationen zu den Kosten für die Verwendung von Spanner finden Sie auf der Seite zu den Preisen.
Hinweis
Führen Sie die unter Einrichten beschriebenen Schritte aus. Dazu gehören das Erstellen und Festlegen eines Standardprojekts von Google Cloud , das Aktivieren der Abrechnung, das Aktivieren der Cloud Spanner API und das Einrichten von OAuth 2.0, um Authentifizierungsdaten für die Verwendung der Cloud Spanner API zu erhalten.
Sie müssen insbesondere gcloud auth
application-default login ausführen, um die lokale Entwicklungsumgebung mit Anmeldedaten für die Authentifizierung einzurichten.
Lokale Go-Umgebung vorbereiten
Installieren Sie Go per Download auf Ihrem Entwicklungscomputer, falls es noch nicht installiert ist.
Konfigurieren Sie die Umgebungsvariable
GOPATHwie unter Installation testen beschrieben, falls sie noch nicht konfiguriert ist.Laden Sie die Beispiele auf Ihren Computer herunter.
git clone https://github.com/GoogleCloudPlatform/golang-samples $GOPATH/src/github.com/GoogleCloudPlatform/golang-samplesWechseln Sie zu dem Verzeichnis, das den Cloud Spanner-Beispielcode enthält:
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/spanner/spanner_snippetsLegen Sie die Umgebungsvariable
PROJECT_IDauf die ID Ihres Projekts in Google Cloud fest:export PROJECT_ID=[MY_PROJECT_ID]
Instanz erstellen
Bei der ersten Verwendung von Spanner müssen Sie eine Instanz erstellen. Dies ist eine Zuordnung von Ressourcen, die von Spanner-Datenbanken verwendet werden. Wenn Sie eine Instanz erstellen, müssen Sie eine Instanzkonfiguration auswählen. Abhängig davon werden der Speicherort Ihrer Daten sowie die Anzahl der zu verwendenden Knoten festgelegt. Anhand der Knotenanzahl wird dann die Menge der Bereitstellungs- und Speicherressourcen in Ihrer Instanz festgelegt.
Unter Instanz erstellen erfahren Sie, wie Sie eine Spanner-Instanz mit einer der folgenden Methoden erstellen. Sie können Ihre Instanz test-instance nennen, um sie mit anderen Themen in diesem Dokument zu verwenden, die auf eine Instanz mit dem Namen test-instance verweisen.
- Google Cloud CLI
- Die Google Cloud Console
- Eine Clientbibliothek (C++, C#, Go, Java, Node.js, PHP, Python, Ruby oder Rust)
Beispieldateien ansehen
Das Beispiel-Repository enthält ein Beispiel, das zeigt, wie Sie Spanner mit Go verwenden.
Sehen Sie sich die Dateisnippet.go an, in der die Verwendung von Spanner gezeigt wird. Der Code zeigt, wie eine neue Datenbank erstellt und verwendet wird. In den Daten wird das Beispielschema verwendet, das auf der Seite Schema und Datenmodell dargestellt ist.
Datenbank erstellen
GoogleSQL
go run snippet.go createdatabase projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgcreatedatabase projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
Created database [example-db]
GoogleSQL
PostgreSQL
Im nächsten Schritt werden Daten in die Datenbank geschrieben.
Datenbankclient erstellen
Bevor Sie Lese- oder Schreibvorgänge ausführen können, müssen Sie eineClient erstellen:
Sie können sich eine Client als Datenbankverbindung vorstellen: Alle Ihre Interaktionen mit Spanner müssen über eine Client erfolgen. In der Regel erstellen Sie Client beim Start Ihrer Anwendung. Anschließend verwenden Sie Client zum Lesen, Schreiben und Ausführen von Transaktionen. Jeder Client verwendet Ressourcen in Cloud Spanner.
Wenn Sie mehrere Clients in derselben Anwendung erstellen, sollten Sie Client.Close() aufrufen, um die Ressourcen des Clients, einschließlich der Netzwerkverbindungen, zu bereinigen, sobald dies nicht mehr benötigt wird.
Weitere Informationen finden Sie in der Referenz zu Client.
Der Code im vorherigen Beispiel zeigt auch, wie ein DatabaseAdminClient erstellt wird, mit dem eine Datenbank erstellt wird.
Daten mit DML schreiben
Sie können Daten mit der Datenbearbeitungssprache (Data Manipulation Language, DML) in eine Lese-Schreib-Transaktion einfügen.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode Update().
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument dmlwrite für Google SQL und dem Argument pgdmlwrite für PostgreSQL aus:
GoogleSQL
go run snippet.go dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgdmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
4 record(s) inserted.
Daten mit Mutationen schreiben
Sie können Daten auch mithilfe von Mutationen einfügen.
Eine Mutation ist ein Container für Mutationsvorgänge. Eine Mutation stellt eine Sequenz von Einfügungen, Aktualisierungen und Löschungen dar, die Cloud Spanner atomar auf verschiedene Zeilen und Tabellen in einer Cloud Spanner-Datenbank anwendet.
Verwenden Sie Mutation.InsertOrUpdate(), um die Mutation INSERT_OR_UPDATE zu erstellen. Damit wird eine neue Zeile hinzugefügt oder Spaltenwerte aktualisiert, falls die Zeile bereits vorhanden ist. Alternativ können Sie die Methode Mutation.Insert() zum Erstellen der Mutation INSERT verwenden, mit der eine neue Zeile hinzugefügt wird.
Client.Apply() werden Mutationen in kleinstmöglichen Schritten auf eine Datenbank angewendet.
Dieser Code zeigt, wie die Daten mithilfe von Mutationen geschrieben werden:
Führen Sie das Beispiel mit dem Argument write aus:
go run snippet.go write projects/PROJECT_ID/instances/test-instance/databases/example-db
Der Befehl sollte erfolgreich ausgeführt werden.
Daten mit SQL abfragen
Spanner unterstützt eine SQL-Schnittstelle zum Lesen von Daten, auf die Sie über die Befehlszeile mit der Google Cloud CLI oder programmatisch mit der Spanner-Clientbibliothek für Go zugreifen können.
Über die Befehlszeile
Führen Sie die folgende SQL-Anweisung aus, damit Sie die Werte aller Spalten aus der Tabelle Albums lesen können:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
GoogleSQL-Pipe-Syntax
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='FROM Albums |> SELECT SingerId, AlbumId, AlbumTitle'
Das Ergebnis zeigt Folgendes:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Spanner-Clientbibliothek für Go verwenden
Zusätzlich zur Ausführung einer SQL-Anweisung in der Befehlszeile können Sie dieselbe SQL-Anweisung programmatisch mit der Spanner-Clientbibliothek für Go ausgeben.
Diese Methoden und Typen werden zum Ausführen der SQL-Abfrage verwendet:Client.Single(): Verwenden Sie diese Option, um den Wert einer oder mehrerer Spalten aus einer oder mehreren Zeilen in einer Spanner-Tabelle zu lesen.Client.Singlegibt einReadOnlyTransactionzurück, das zum Ausführen einer Lese- oder SQL-Anweisung verwendet wird.ReadOnlyTransaction.Query(): Verwenden Sie diese Methode, um eine Abfrage für eine Datenbank auszuführen.- Der Typ
Statement: Verwenden Sie diesen Typ, um einen SQL-String zu erstellen. - Der Typ
Row: Verwenden Sie diesen Typ, um auf die Daten zuzugreifen, die von einer SQL-Anweisung oder einem Leseaufruf zurückgegeben werden.
So geben Sie die Abfrage aus und greifen auf die Daten zu:
Führen Sie das Beispiel mit dem Argument query aus.
go run snippet.go query projects/PROJECT_ID/instances/test-instance/databases/example-db
Sie sollten folgendes Ergebnis sehen:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Abfrage mit einem SQL-Parameter
Wenn Ihre Anwendung eine häufig ausgeführte Abfrage hat, können Sie die Leistung verbessern, indem Sie sie parametrisieren. Die resultierende parametrische Abfrage kann im Cache gespeichert und wiederverwendet werden, was die Kompilierungskosten senkt. Weitere Informationen finden Sie unter Abfrageparameter verwenden, um häufig ausgeführte Abfragen zu beschleunigen.
Hier ist ein Beispiel für die Verwendung eines Parameters in der WHERE-Klausel, um Datensätze abzufragen, die einen bestimmten Wert für LastName enthalten.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument querywithparameter für Google SQL und dem Argument pgqueryparameter für PostgreSQL aus.
GoogleSQL
go run snippet.go querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgqueryparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
Die Ausgabe sollte etwa so aussehen:
12 Melissa Garcia
Daten mit der Lese-API auslesen
Zusätzlich zur SQL-Schnittstelle von Spanner unterstützt Spanner auch eine Leseschnittstelle.
Verwenden SieReadOnlyTransaction.Read(), um Zeilen aus der Datenbank zu lesen. Nutzen Sie KeySet, um eine Sammlung der zu lesenden Schlüssel und Schlüsselbereiche zu definieren.
So lesen Sie die Daten aus:
Führen Sie das Beispiel mit dem Argument read aus.
go run snippet.go read projects/PROJECT_ID/instances/test-instance/databases/example-db
Die Ausgabe sollte etwa so aussehen:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Datenbankschema aktualisieren
Beispiel: Sie müssen eine neue Spalte namens MarketingBudget zur Tabelle Albums hinzufügen. Damit einer vorhandenen Tabelle eine neue Spalte hinzugefügt werden kann, muss das Datenbankschema aktualisiert werden. Spanner unterstützt Schemaaktualisierungen für Datenbanken, ohne dass die Traffic-Bereitstellung unterbrochen werden muss. Bei einer Schemaaktualisierung muss die Datenbank nicht offline geschaltet und es müssen keine ganzen Tabellen oder Spalten gesperrt werden. Sie können während der Aktualisierung weiter Daten in die Datenbank schreiben. Weitere Informationen zu unterstützten Schemaaktualisierungen und zur Leistung von Schemaänderungen finden Sie unter Schemaaktualisierungen vornehmen.
Spalte hinzufügen
Sie können eine Spalte über die Befehlszeile mit der Google Cloud CLI oder programmatisch mit der Spanner-Clientbibliothek für Go hinzufügen.
Über die Befehlszeile
Verwenden Sie den folgenden Befehl ALTER TABLE, um die neue Spalte zur Tabelle hinzuzufügen:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget BIGINT'
Hier sollten Sie dies sehen:
Schema updating...done.
Spanner-Clientbibliothek für Go verwenden
Verwenden SieDatabaseAdminClient.UpdateDatabaseDdl(), um das Schema zu ändern:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument addnewcolumn für Google SQL und dem Argument pgaddnewcolumn für PostgreSQL aus.
GoogleSQL
go run snippet.go addnewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddnewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
Added MarketingBudget column.
Daten in die neue Spalte schreiben
Mit dem folgenden Code werden Daten in die neue Spalte geschrieben. Er legt für MarketingBudget den Wert 100000 für den Zeilenschlüssel fest, der durch Albums(1, 1) angegeben wird, und er legt 500000 für den Zeilenschlüssel fest, der durch Albums(2, 2) angegeben wird.
Führen Sie das Beispiel mit dem Argument update aus.
go run snippet.go update projects/PROJECT_ID/instances/test-instance/databases/example-db
Sie können auch eine SQL-Abfrage oder einen Leseaufruf ausführen, um die Werte abzurufen, die Sie gerade geschrieben haben.
Mit diesem Code können Sie die Abfrage ausführen:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument querynewcolumn für Google SQL und dem Argument pgquerynewcolumn für PostgreSQL aus, um diese Abfrage auszuführen.
GoogleSQL
go run snippet.go querynewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgquerynewcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
1 1 100000
1 2 NULL
2 1 NULL
2 2 500000
2 3 NULL
Daten aktualisieren
Sie können Daten mit DML in einer Lese-Schreib-Transaktion aktualisieren.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode Update().
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument dmlwritetxn aus.
go run snippet.go dmlwritetxn projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
Moved 200000 from Album2's MarketingBudget to Album1's.
Sekundären Index verwenden
Beispiel: Sie möchten alle Zeilen aus Albums abrufen, deren Wert für AlbumTitle in einem bestimmten Bereich liegen. Sie könnten dazu alle Werte aus der Spalte AlbumTitle mit einer SQL-Anweisung oder einem Leseaufruf lesen und dann die Zeilen verwerfen, die die Kriterien nicht erfüllen. Dieser vollständige Tabellenscan wäre jedoch sehr kostspielig, insbesondere bei Tabellen mit vielen Zeilen. Stattdessen können Sie einen sekundären Index für die Tabelle erstellen und damit das Abrufen von Zeilen beim Suchen über Spalten mit nicht primärem Schlüssel beschleunigen.
Damit ein sekundärer Index einer vorhandenen Tabelle hinzugefügt werden kann, muss das Schema aktualisiert werden. Wie bei anderen Schemaaktualisierungen kann mit Spanner ein Index hinzugefügt werden, ohne dass die Traffic-Bereitstellung unterbrochen werden muss. Spanner füllt den Index automatisch mit Ihren vorhandenen Daten auf. Backfills können einige Minuten dauern. Sie müssen aber die Datenbank nicht offline schalten und können während des Vorgangs weiter in die indexierten Tabellen schreiben. Weitere Informationen finden Sie unter Sekundären Index hinzufügen.
Nachdem Sie einen sekundären Index hinzugefügt haben, verwendet Spanner ihn automatisch für SQL-Abfragen, die mit dem Index wahrscheinlich schneller ausgeführt werden. Wenn Sie die Leseschnittstelle verwenden, müssen Sie den Index angeben, den Sie nutzen möchten.
Sekundären Index hinzufügen
Sie können einen Index über die Befehlszeile mit der gcloud CLI oder programmatisch mit der Spanner-Clientbibliothek für Go hinzufügen.
Über die Befehlszeile
Verwenden Sie den folgenden CREATE INDEX-Befehl, um der Datenbank einen Index hinzuzufügen:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
Hier sollten Sie dies sehen:
Schema updating...done.
Spanner-Clientbibliothek für Go verwenden
Verwenden SieUpdateDatabaseDdl(), um einen Index hinzuzufügen:
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollten Sie das sehen:
Added index
Mit dem Index auslesen
Für SQL-Abfragen verwendet Spanner automatisch einen geeigneten Index. In der Leseschnittstelle müssen Sie den Index in Ihrer Anfrage angeben.
Für die Verwendung des Index in der Leseschnittstelle nutzen Sie ReadOnlyTransaction.ReadUsingIndex(). Dieser Vorgang dient zum Lesen von null oder mehr Zeilen aus einer Datenbank mithilfe eines Index.
Mit dem folgenden Code werden alle Spalten AlbumId und AlbumTitle aus dem Index AlbumsByAlbumTitle abgerufen.
Führen Sie das Beispiel mit dem Argument readindex aus.
go run snippet.go readindex projects/PROJECT_ID/instances/test-instance/databases/example-db
Hier sollten Sie dies sehen:
2 Forever Hold Your Peace
2 Go, Go, Go
1 Green
3 Terrified
1 Total Junk
Index für reine Indexlesevorgänge hinzufügen
Vielleicht haben Sie bemerkt, dass im obigen Beispiel die Spalte MarketingBudget nicht gelesen wird. Die Leseschnittstelle von Spanner unterstützt die Möglichkeit nicht, einen Index mit einer Datentabelle zu verbinden, um Werte zu suchen, die nicht im Index gespeichert sind.
Erstellen Sie eine alternative Definition von AlbumsByAlbumTitle, die eine Kopie von MarketingBudget im Index speichert.
Über die Befehlszeile
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) INCLUDE (MarketingBudget)
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollte Folgendes angezeigt werden:
Schema updating...done.
Spanner-Clientbibliothek für Go verwenden
Verwenden SieUpdateDatabaseDdl(), um einen Index mit einer STORING-Klausel für GoogleSQL und einer INCLUDE-Klausel für PostgreSQL hinzuzufügen:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem Argument addstoringindex aus.
GoogleSQL
go run snippet.go addstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run snippet.go pgaddstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollten Sie das sehen:
Added storing index
Sie können jetzt einen Lesevorgang ausführen, der die Spalten AlbumId, AlbumTitle und MarketingBudget aus dem Index AlbumsByAlbumTitle2 abruft:
Führen Sie das Beispiel mit dem Argument readstoringindex aus.
go run snippet.go readstoringindex projects/PROJECT_ID/instances/test-instance/databases/example-db
Die Ausgabe sollte etwa so aussehen:
2 Forever Hold Your Peace 300000
2 Go, Go, Go NULL
1 Green NULL
3 Terrified NULL
1 Total Junk 300000
Daten mit schreibgeschützten Transaktionen abrufen
Angenommen, Sie möchten mehr als einen Lesevorgang mit demselben Zeitstempel ausführen. Bei schreibgeschützten Transaktionen wird ein gleichbleibendes Präfix des Commit-Verlaufs der Transaktionen beibehalten, damit die Anwendung immer konsistente Daten erhält.
Nutzen Sie den Typ ReadOnlyTransaction, um schreibgeschützte Transaktionen auszuführen. Mit Client.ReadOnlyTransaction() können Sie eine ReadOnlyTransaction abrufen.
So werden eine Abfrage und ein Lesevorgang in derselben schreibgeschützten Transaktion ausgeführt:
Führen Sie das Beispiel mit dem Argument readonlytransaction aus.
go run snippet.go readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
Die Ausgabe sollte etwa so aussehen:
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Bereinigen
Löschen Sie die Datenbank und die erstellte Instanz, um zu vermeiden, dass Ihrem Cloud-Rechnungskonto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden.
Datenbank löschen
Wenn Sie eine Instanz löschen, werden alle darin enthaltenen Datenbanken automatisch gelöscht. In diesem Schritt wird gezeigt, wie eine Datenbank gelöscht wird, ohne eine Instanz zu löschen (dabei fallen weiterhin Gebühren für die Instanz an).
Über die Befehlszeile
gcloud spanner databases delete example-db --instance=test-instance
Google Cloud Console verwenden
Rufen Sie in der Google Cloud Console die Seite Spanner-Instanzen auf.
Klicken Sie auf die Instanz.
Klicken Sie auf die Datenbank, die Sie löschen möchten.
Klicken Sie auf der Seite Datenbankdetails auf Löschen.
Bestätigen Sie, dass die Datenbank gelöscht werden soll, und klicken Sie auf Löschen.
Instanz löschen
Beim Löschen einer Instanz werden alle Datenbanken, die in der Instanz erstellt wurden, automatisch gelöscht.
Über die Befehlszeile
gcloud spanner instances delete test-instance
Google Cloud Console verwenden
Rufen Sie in der Google Cloud Console die Seite Spanner-Instanzen auf.
Klicken Sie auf die Instanz.
Klicken Sie auf Löschen.
Bestätigen Sie, dass die Instanz gelöscht werden soll, und klicken Sie auf Löschen.
Nächste Schritte
Weitere Informationen zu Anmeldedaten für die Autorisierung und Authentifizierung finden Sie unter Mithilfe von Clientbibliotheken bei Cloud-Diensten authentifizieren.
Weitere Informationen zu den Best Practices für das Schemadesign in Spanner.