Ziele
In dieser Anleitung werden die folgenden Schritte mit dem Spanner-Treiber „database/sql“ 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 Datenbank-/SQL-Umgebung vorbereiten
Laden Sie Go herunter und installieren Sie es auf Ihrem Entwicklungscomputer, falls es noch nicht installiert ist.
Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer:
git clone https://github.com/googleapis/go-sql-spanner.gitWechseln Sie zu dem Verzeichnis, das den Cloud Spanner-Beispielcode enthält:
cd go-sql-spanner/snippets
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 Spanner mit database/sql verwendet wird.
Sehen Sie sich die Dateigetting_started_guide.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
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Hier sollten Sie dies sehen:
Creating database...done.
Tabellen erstellen
Mit dem folgenden Code werden zwei Tabellen in der Datenbank erstellt.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go createtables projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go createtablespg projects/PROJECT_ID/instances/test-instance/databases/example-db
Im nächsten Schritt werden Daten in die Datenbank geschrieben.
Verbindung herstellen
Zum Ausführen von Lese- oder Schreibvorgängen müssen Sie einensql.DB erstellen. sql.DB enthält einen Verbindungspool, der für die Interaktion mit Spanner verwendet werden kann. Der Datenbankname und andere Verbindungseigenschaften werden im database/sql-Datenquellennamen angegeben.
GoogleSQL
PostgreSQL
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 Funktion ExecContext.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go dmlwritepg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
4 records 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.
conn.Raw, um einen Verweis auf die zugrunde liegende Spanner-Verbindung abzurufen. Die Funktion SpannerConn.Apply wendet Mutationen atomar auf die Datenbank an.
Der folgende Code zeigt, wie die Daten mithilfe von Mutationen geschrieben werden:
GoogleSQL
PostgreSQL
Führen Sie das folgende Beispiel mit dem Argument write aus:
GoogleSQL
go run getting_started_guide.go write projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writepg projects/PROJECT_ID/instances/test-instance/databases/example-db
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 dem Spanner-Datenbank-/SQL-Treiber 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'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
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-Datenbank/SQL-Treiber verwenden
Sie können eine SQL-Anweisung nicht nur in der Befehlszeile ausführen, sondern auch programmatisch mit dem Spanner-Datenbank-/SQL-Treiber.
Die folgenden Funktionen und Structs werden zum Ausführen einer SQL-Abfrage verwendet:- Die Funktion
QueryContextin der StrukturDB: Verwenden Sie diese Funktion, um eine SQL-Anweisung auszuführen, die Zeilen zurückgibt, z. B. eine Abfrage oder eine DML-Anweisung mit einerTHEN RETURN-Klausel. - Die Struktur
Rows: Verwenden Sie diese, um auf die von einer SQL-Anweisung zurückgegebenen Daten zuzugreifen.
Im folgenden Beispiel wird die Funktion QueryContext verwendet:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go query projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querypg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
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.
Der Spanner-Datenbank-/SQL-Treiber unterstützt sowohl positionale als auch benannte Abfrageparameter. Ein ? in einer SQL-Anweisung gibt einen positionellen Abfrageparameter an. Übergeben Sie die Suchparameterwerte als zusätzliche Argumente an die Funktion QueryContext. Beispiel:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querywithparameterpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
12 Melissa Garcia
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 dem Spanner-Datenbank-/SQL-Treiber 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 marketing_budget bigint'
Hier sollten Sie dies sehen:
Schema updating...done.
Spanner-Datenbank/SQL-Treiber verwenden
Verwenden Sie die FunktionExecContext, um das Schema zu ändern:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go addcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go addcolumnpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
Added MarketingBudget column.
DDL-Batch ausführen
Wir empfehlen, mehrere Schemaänderungen in einem Batch auszuführen. Verwenden Sie die Befehle START BATCH DDL und RUN BATCH, um einen DDL-Batch auszuführen. Im folgenden Beispiel werden zwei Tabellen in einem Batch erstellt:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go ddlbatch projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go ddlbatchpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
Added Venues and Concerts tables.
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.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go update projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go updatepg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
Updated 2 albums
Sie können auch eine SQL-Abfrage ausführen, um die Werte abzurufen, die Sie gerade geschrieben haben.
Im folgenden Beispiel wird die Funktion QueryContext verwendet, um eine Abfrage auszuführen:
GoogleSQL
PostgreSQL
Führen Sie den folgenden Befehl aus, um diese Abfrage auszuführen:
GoogleSQL
go run getting_started_guide.go querymarketingbudget projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querymarketingbudgetpg 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.
Rufen Sie DB.BeginTx auf, um Lese-/Schreibtransaktionen in database/sql auszuführen.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go writewithtransactionusingdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writewithtransactionusingdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Transaktions-Tags und Anfrage-Tags
Verwenden Sie Transaktions- und Anfrage-Tags, um Fehler bei Transaktionen und Abfragen in Spanner zu beheben. Sie können zusätzliche Transaktionsoptionen an die Funktion spannerdriver.BeginReadWriteTransaction übergeben.
Verwenden Sie spannerdriver.ExecOptions, um zusätzliche Abfrageoptionen für eine SQL-Anweisung zu übergeben. Beispiel:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go tags projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go tagspg projects/PROJECT_ID/instances/test-instance/databases/example-db
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.
Setzen Sie das Feld TxOptions.ReadOnly auf true, um eine schreibgeschützte Transaktion auszuführen.
So werden eine Abfrage und ein Lesevorgang in derselben schreibgeschützten Transaktion ausgeführt:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go readonlytransactionpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt Folgendes:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
Partitionierte Abfragen und Data Boost
Die partitionQuery API teilt eine Abfrage in kleinere Teile oder Partitionen auf und verwendet mehrere Maschinen, um die Partitionen parallel abzurufen. Jede Partition wird durch ein Partitionstoken identifiziert. Die partitionQuery API hat eine höhere Latenz als die Standard-query API, da sie nur für Bulk-Vorgänge wie das Exportieren oder Scannen der gesamten Datenbank vorgesehen ist.
Mit Data Boost können Sie Analyseabfragen und Datenexporte nahezu ohne Auswirkungen auf vorhandene Arbeitslasten auf der bereitgestellten Spanner-Instanz ausführen. Data Boost unterstützt nur partitionierte Abfragen.
Im folgenden Beispiel wird gezeigt, wie Sie eine partitionierte Abfrage mit Data Boost mit dem database/sql-Treiber ausführen:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go databoost projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go databoostpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Partitionierte DML
Die partitionierte Datenbearbeitungssprache (DML) ist für die folgenden Arten von Bulk-Aktualisierungen und -Löschvorgängen konzipiert:
- Regelmäßige und automatische Speicherbereinigungsvorgänge.
- Backfilling neuer Spalten mit Standardwerten.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
go run getting_started_guide.go pdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go pdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
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.