Lernziele
In dieser Anleitung werden Sie durch die folgenden Schritte mit der Spanner-Clientbibliothek für Ruby geführt:
- 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 Spanner verwendet, eine kostenpflichtige Komponente von Google Cloud. Informationen zu den Kosten der Nutzung von Spanner finden Sie unter Preise.
Hinweis
Führen Sie die unter Einrichten beschriebenen Schritte aus, die das Erstellen und Festlegen eines standardmäßigen Google Cloud-Projekts, das Aktivieren der Rechnungsstellung, das Aktivieren der Cloud Spanner API und das Einrichten von OAuth 2.0 umfassen, um Anmeldedaten für die Authentifizierung 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 Ruby-Umgebung vorbereiten
Installieren Sie Folgendes auf Ihrem Entwicklungscomputer, falls nicht bereits vorhanden:
Klonen Sie das Repository der Beispiel-App auf Ihren lokalen Computer:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
Sie können das Beispiel auch als ZIP-Datei herunterladen und extrahieren.
Wechseln Sie zu dem Verzeichnis, das den Spanner-Beispielcode enthält:
cd ruby-docs-samples/spanner/
Installieren Sie die Abhängigkeiten:
bundle install
Legen Sie als GOOGLE_PROJECT_ID-Umgebungsvariable Ihre Projekt-ID für die Google Cloud Platform fest.
export GOOGLE_CLOUD_PROJECT=[MY_PROJECT_ID]
Instanz erstellen
Wenn Sie Spanner zum ersten Mal verwenden, müssen Sie eine Instanz erstellen. Dies ist eine Zuweisung 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.
Führen Sie den folgenden Befehl aus, um eine Spanner-Instanz in der Region us-central1
mit 1 Knoten zu erstellen:
gcloud spanner instances create test-instance --config=regional-us-central1 \
--description="Test Instance" --nodes=1
Dadurch wird eine Instanz mit diesen Properties erstellt:
- Instanz-ID
test-instance
- Anzeigename
Test Instance
- Instanzkonfiguration
regional-us-central1
– Bei regionalen Konfigurationen werden Daten in nur einer Region gespeichert, während sie bei multiregionalen Konfigurationen auf mehrere Regionen verteilt werden. Weitere Informationen finden Sie unter Informationen zu Instanzen. - Knotenanzahl 1 –
node_count
entspricht der Anzahl der Bereitstellungs- und Speicherressourcen in der Instanz, die für Datenbanken zur Verfügung stehen. Weitere Informationen finden Sie unter Knoten und Verarbeitungseinheiten.
Hier sollten Sie das sehen:
Creating instance...done.
Beispieldateien ansehen
Das Beispiel-Repository enthält ein Beispiel, das zeigt, wie Spanner mit Ruby verwendet wird.
Sehen Sie sich die Dateispanner_samples.rb
an. Darin wird die Verwendung von Spanner erläutert. 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
Erstellen Sie eine Datenbank mit dem Namen example-db
in der Instanz test-instance
, indem Sie Folgendes in der Befehlszeile ausführen:
bundle exec ruby spanner_samples.rb create_database test-instance example-db
Hier sollten Sie das sehen:
Created database example-db on instance test-instance
Mit dem folgenden Code werden eine Datenbank und zwei Tabellen in der Datenbank erstellt.
Im nächsten Schritt werden Daten in die Datenbank geschrieben.
Datenbankclient erstellen
Zum Ausführen von Lese- oder Schreibvorgängen müssen Sie einenClient
erstellen. Sie können sich ein Client
wie eine Datenbankverbindung vorstellen: Alle Interaktionen mit Spanner müssen einen Client
durchlaufen. In der Regel erstellen Sie beim Starten Ihrer Anwendung einen Client
. Anschließend verwenden Sie den Client
zum Lesen, Schreiben und Ausführen von Transaktionen. Der folgende Code zeigt das Erstellen eines Clients.
Weitere Informationen finden Sie in der Referenz zu Client
.
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 execute_update()
.
Führen Sie das Beispiel mit dem Argument write_using_dml
aus.
bundle exec ruby spanner_samples.rb write_using_dml test-instance example-db
Hier sollten Sie das sehen:
4 records inserted.
Daten mit Mutationen schreiben
Sie können Daten auch mithilfe von Mutationen einfügen.
Daten werden mit einem Client
-Objekt geschrieben. Mit der Methode Client#commit
werden Transaktionen für Schreibvorgänge erstellt, die für Spalten, Zeilen und Tabellen in einer Datenbank zu einem einzigen logischen Zeitpunkt als unteilbarer Vorgang ausgeführt werden. Danach werden sie mit Commits festgeschrieben.
Dieser Code zeigt, wie die Daten mithilfe von Mutationen geschrieben werden:
Führen Sie das Beispiel mit dem Argument insert_data
aus.
bundle exec ruby spanner_samples.rb insert_data test-instance example-db
Hier sollten Sie das sehen:
Inserted data
Daten mit SQL abfragen
Spanner unterstützt eine native SQL-Schnittstelle zum Lesen von Daten, auf die Sie über die Befehlszeile mit der Google Cloud CLI oder programmatisch über die Spanner-Clientbibliothek für Ruby 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:
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
Das Ergebnis sollte in etwa so aussehen:
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 Ruby verwenden
Neben der Ausführung einer SQL-Anweisung in der Befehlszeile können Sie die gleiche SQL-Anweisung programmatisch mit der Spanner-Clientbibliothek für Ruby ausführen.
Verwenden Sie die Methode Client#execute
zum Ausführen der SQL-Abfrage. Über das Ruby-Symbol :ColumnName
können Sie auf Daten für eine bestimmte Spalte aus einer Zeile zugreifen.
So geben Sie die Abfrage aus und greifen auf die Daten zu:
Führen Sie das Beispiel mit dem Argument query_data
aus.
bundle exec ruby spanner_samples.rb query_data test-instance 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 enthält, können Sie deren Leistung verbessern, indem Sie sie parametrisieren. Die resultierende parametrische Abfrage kann im Cache gespeichert und wiederverwendet werden, wodurch die Kompilierungskosten reduziert werden. Weitere Informationen finden Sie unter Häufige Abfragen beschleunigen.
Hier ist ein Beispiel für die Verwendung eines Parameters in der WHERE
-Klausel zur Abfrage von Einträgen, die einen bestimmten Wert für LastName
enthalten.
Führen Sie das Beispiel mit dem Argument "query_with_parameter" aus.
bundle exec ruby spanner_samples.rb query_with_parameter test-instance example-db
Sie sollten folgendes Ergebnis sehen:
12 Melissa Garcia
Daten mit der Lese-API auslesen
Neben der SQL-Schnittstelle von Spanner unterstützt Spanner auch eine Leseschnittstelle.
Verwenden Sie die Methode Client#read
der Klasse Client
, um Zeilen aus der Datenbank zu lesen.
So lesen Sie die Daten aus:
Führen Sie das Beispiel mit dem Argument read_data
aus.
bundle exec ruby spanner_samples.rb read_data test-instance 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 eine Datenbank, während die Datenbank weiterhin Traffic verarbeitet. 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 mithilfe der Google Cloud CLI oder programmatisch mit der Spanner-Clientbibliothek für Ruby 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 das sehen:
Schema updating...done.
Spanner-Clientbibliothek für Ruby verwenden
Verwenden Sie die MethodeDatabase#update
der Klasse Database
, um das Schema zu ändern:
Führen Sie das Beispiel mit dem Argument add_column
aus.
bundle exec ruby spanner_samples.rb add_column test-instance example-db
Hier sollten Sie das sehen:
Added the 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 500000
für den Zeilenschlüssel, der durch Albums(2, 2)
angegeben wird.
Führen Sie das Beispiel mit dem Argument update_data
aus.
bundle exec ruby spanner_samples.rb update_data test-instance example-db
Hier sollten Sie das sehen:
Updated data
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:
Für diese Abfrage führen Sie das Beispiel mit dem Argument query_data_with_new_column
aus.
bundle exec ruby spanner_samples.rb query_data_with_new_column test-instance example-db
Hier sollten Sie das sehen:
1 1 100000
1 2
2 1
2 2 500000
2 3
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 execute_update()
.
Führen Sie das Beispiel mit dem Argument write_with_transaction_using_dml
aus.
bundle exec ruby spanner_samples.rb write_with_transaction_using_dml test-instance example-db
Hier sollten Sie das sehen:
Transaction complete
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 unterstützt Spanner das Hinzufügen eines Index, während die Datenbank weiterhin Traffic verarbeitet. Spanner füllt den Index automatisch mit Ihren vorhandenen Daten. 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, wird dieser von Spanner automatisch für SQL-Abfragen verwendet, 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 gcloud CLI oder programmatisch über die Spanner-Clientbibliothek für Ruby hinzufügen.
Über die Befehlszeile
Verwenden Sie den folgenden Befehl CREATE INDEX
, 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 das sehen:
Schema updating...done.
Spanner-Clientbibliothek für Ruby verwenden
Verwenden Sie die Methode Database#update
der Klasse Database
, um einen Index hinzuzufügen:
Führen Sie das Beispiel mit dem Argument create_index
aus.
bundle exec ruby spanner_samples.rb create_index test-instance example-db
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollten Sie das sehen:
Added the AlbumsByAlbumTitle index
Mit dem Index auslesen
Bei SQL-Abfragen verwendet Spanner automatisch einen geeigneten Index. In der Leseschnittstelle müssen Sie den Index in Ihrer Anfrage angeben.
Um den Index in der Leseschnittstelle zu verwenden, stellen Sie der Methode read
der Klasse Client
einen index
-Parameter bereit.
Führen Sie das Beispiel mit dem Argument read_data_with_index
aus.
bundle exec ruby spanner_samples.rb read_data_with_index test-instance example-db
Hier sollten Sie das sehen:
2 Forever Hold Your Peace
2 Go, Go, Go
1 Green
3 Terrified
1 Total Junk
Index für Lesevorgänge hinzufügen, die nur indexiert sind
Vielleicht haben Sie bemerkt, dass im obigen Beispiel die Spalte MarketingBudget
nicht gelesen wird. Dies liegt daran, dass die Leseschnittstelle von Spanner die Möglichkeit der Zusammenführung eines Index mit einer Datentabelle zum Abrufen von Werten, die nicht im Index gespeichert sind, nicht unterstützt.
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 Ruby verwenden
Verwenden Sie die MethodeDatabase#update
der Klasse Database
, um einen Index mit einer STORING
-Klausel hinzuzufügen:
Führen Sie das Beispiel mit dem Argument create_storing_index
aus.
bundle exec ruby spanner_samples.rb create_storing_index test-instance example-db
Hier sollten Sie dies sehen:
Added the AlbumsByAlbumTitle2 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 read_data_with_storing_index
aus.
bundle exec ruby spanner_samples.rb read_data_with_storing_index test-instance example-db
Die Ausgabe sollte etwa so aussehen:
2 Forever Hold Your Peace 300000
2 Go, Go, Go
1 Green
3 Terrified
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.
Verwenden Sie ein Snapshot
-Objekt, um schreibgeschützte Transaktionen auszuführen. Verwenden Sie die Methode snapshot
der Klasse Client
, um ein Snapshot
-Objekt zu erhalten.
So werden eine Abfrage und ein Lesevorgang in derselben schreibgeschützten Transaktion ausgeführt:
Führen Sie das Beispiel mit dem Argument read_only_transaction
aus.
bundle exec ruby spanner_samples.rb read_only_transaction test-instance example-db
Die Ausgabe sollte etwa so aussehen:
2 Forever Hold Your Peace 2
2 Go, Go, Go 1
1 Green 2
3 Terrified 2
1 Total Junk 1
1 Total Junk 1
2 Go, Go, Go 1
1 Green 2
2 Forever Hold Your Peace 2
3 Terrified 2
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 Authentifizierung bei Cloud-Diensten mit Clientbibliotheken.