Lernziele
Diese Anleitung führt Sie durch die folgenden Schritte mit der Cloud Spanner-Clientbibliothek für PHP:
- Cloud 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 von Google Cloud. Informationen zu den Kosten der Nutzung von Cloud 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 PHP-Umgebung vorbereiten
Befolgen Sie die Schritte unter Dienstkonten, um ein Dienstkonto als Ihre Standardanmeldedaten für Anwendungen einzurichten. Durch Ausführen dieser Schritte erhalten Sie sowohl eine Dienstkonto-Schlüsseldatei (im JSON-Format) als auch eine Umgebungsvariable
GOOGLE_APPLICATION_CREDENTIALS
. Damit können Sie sich bei der Cloud Spanner API authentifizieren.Installieren Sie Folgendes auf Ihrem Entwicklungscomputer, falls nicht bereits vorhanden:
Klonen Sie das Repository der Beispielanwendung auf Ihren lokalen Computer:
git clone https://github.com/GoogleCloudPlatform/php-docs-samples
Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.
Wechseln Sie in das Verzeichnis, das den Cloud Spanner-Beispielcode enthält:
cd php-docs-samples/spanner
Installieren Sie die Abhängigkeiten:
composer install
Dadurch wird die Cloud Spanner-Clientbibliothek für PHP installiert, die Sie einem beliebigen Projekt durch Ausführen von
composer require google/cloud-spanner
hinzufügen können.
Instanz erstellen
Wenn Sie Cloud Spanner zum ersten Mal verwenden, müssen Sie eine Instanz erstellen. Dabei handelt es sich um eine Zuordnung von Ressourcen, die von Cloud 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 Cloud Spanner-Instanz in der Region us-central1
mit nur einem 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 dazu finden Sie unter 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 dazu finden Sie unter Knotenzahl.
Hier sollten Sie das sehen:
Creating instance...done.
Beispieldateien ansehen
Das Beispiel-Repository enthält ein Beispiel, das zeigt, wie man Cloud Spanner mit PHP verwendet.
Betrachten Sie die Funktionen in src/create_database.php
und src/add_column.php
näher. Damit können Sie eine Datenbank erstellen und ein Datenbankschema ändern. Für die Daten wird das auf der Seite Schema und Datenmodell angezeigte Beispielschema verwendet.
Datenbank erstellen
Erstellen Sie eine Datenbank mit dem Namen example-db
in der Instanz test-instance
, indem Sie Folgendes in der Befehlszeile ausführen:
php spanner.php create-database test-instance example-db
Hier sollten Sie das sehen:
Created database example-db on instance test-instance
Sie haben gerade eine Cloud Spanner-Datenbank erstellt. Die Datenbank wurde aus diesem Code erstellt:
Mit dem Code werden außerdem die beiden Tabellen Singers
und Albums
für eine einfache Musikanwendung definiert. Die Tabellen werden im weiteren Verlauf dieser Seite verwendet. Sehen Sie sich das Beispielschema an, falls Sie es noch nicht getan haben.
Im nächsten Schritt werden Daten in die Datenbank geschrieben.
Datenbankclient erstellen
Für Lese- und Schreibvorgänge benötigen Sie eine Instanz vonGoogle\Cloud\Spanner\Database
.
Sie können sich Database
wie eine Datenbankverbindung vorstellen. Alle Interaktionen mit Cloud Spanner müssen über Database
ausgeführt werden. In der Regel erstellen Sie Database
beim Start Ihrer Anwendung. Anschließend verwenden Sie Database
zum Lesen, Schreiben und Ausführen von Transaktionen.
Da jeder Client Ressourcen in Cloud Spanner verwendet, müssen Sie mit Database::close
die Ressourcen des Clients, einschließlich der Netzwerkverbindungen, bereinigen.
Weitere Informationen finden Sie in der Referenz zu Database
.
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 executeUpdate()
.
Führen Sie das Beispiel mit dem Befehl write-data-with-dml
aus.
php spanner.php write-data-with-dml test-instance example-db
Hier sollten Sie das sehen:
Inserted 4 row(s).
Daten mit Mutationen schreiben
Sie können Daten auch mithilfe von Mutationen einfügen.
Daten werden mithilfe der Methode Database::insertBatch
geschrieben. Mit insertBatch
fügen Sie einer Tabelle neue Zeilen hinzu. Alle Eingaben in einen einzelnen Batch werden in kleinstmöglichen Schritten angewendet.
Dieser Code zeigt, wie die Daten mithilfe von Mutationen geschrieben werden:
Führen Sie das Beispiel mit dem Befehl insert-data
aus.
php spanner.php insert-data test-instance example-db
Hier sollten Sie das sehen:
Inserted data.
Daten mit SQL abfragen
Cloud Spanner unterstützt eine native SQL-Oberfläche zum Lesen von Daten, auf die Sie in der Befehlszeile mit dem gcloud
-Befehlszeilentool oder programmatisch mit der Cloud Spanner-Clientbibliothek für PHP 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
Mit der Cloud Spanner-Clientbibliothek für PHP
Als Alternative zum Ausführen einer SQL-Anweisung in der Befehlszeile können Sie die gleiche SQL-Anweisung programmatisch mithilfe der Cloud Spanner-Clientbibliothek für PHP ausführen.
Führen Sie mitDatabase::execute()
die SQL-Abfrage aus.
So geben Sie die Abfrage aus und greifen auf die Daten zu:
Führen Sie das Beispiel mit dem Befehl query-data
aus.
php spanner.php query-data test-instance example-db
Sie sollten dieses Ergebnis sehen:
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
Die Ergebnisse werden nicht unbedingt in dieser Reihenfolge angezeigt. Wenn Sie ein sortiertes Ergebnis benötigen, verwenden Sie die Klausel ORDER BY
, wie unter Best Practices für SQL erläutert.
Abfrage mit einem SQL-Parameter
Sie können mithilfe von unterstützten SQL-Typen benutzerdefinierte Werte in SQL-Anweisungen einfügen.
Im Folgenden finden Sie ein Beispiel für die Verwendung von @lastName
als Parameter in der WHERE
-Klausel zum Abfragen von Datensätzen, die einen bestimmten Wert für LastName
enthalten.
Führen Sie das Beispiel mit dem Befehl "query-data-with-parameter" aus.
php spanner.php query-data-with-parameter test-instance example-db
Es sollte das folgende Ergebnis angezeigt werden:
SingerId: 12, FirstName: Melissa, LastName: Garcia
Daten mit der Lese-API auslesen
Neben der SQL-Schnittstelle unterstützt Cloud Spanner auch eine Leseschnittstelle.
Verwenden Sie Database::read()
, um Zeilen aus der Datenbank zu lesen. Verwenden Sie ein KeySet
-Objekt, um eine Sammlung von zu lesenden Schlüsseln und Schlüsselbereichen zu definieren.
So lesen Sie die Daten aus:
Führen Sie das Beispiel mit dem Befehl read-data
aus.
php spanner.php read-data test-instance example-db
Die Ausgabe sollte in etwa so aussehen:
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold your Peace
SingerId: 2, AlbumId: 3, AlbumTitle: 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. Cloud 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 während der Schemaänderung finden Sie unter Schemaaktualisierungen.
Spalte hinzufügen
Sie können eine Spalte in der Befehlszeile mithilfe des gcloud
-Befehlszeilentools oder programmatisch mithilfe der Cloud Spanner-Clientbibliothek für PHP hinzufügen.
Über die Befehlszeile
Verwenden Sie den folgenden Befehl ALTER TABLE
, um die neue Spalte zur Tabelle hinzuzufügen:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
Es sollte dann Folgendes angezeigt werden:
Schema updating...done.
Mit Cloud Spanner-Clientbibliothek für PHP
Verwenden Sie Database::updateDdl
, um das Schema zu ändern:
Führen Sie das Beispiel mit dem Befehl add-column
aus.
php spanner.php add-column test-instance example-db
Es sollte dann Folgendes angezeigt werden:
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 Befehl update-data
aus.
php spanner.php update-data test-instance example-db
Es sollte dann Folgendes angezeigt werden:
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.
php spanner.php query-data-with-new-column test-instance example-db
Hier sollten Sie das sehen:
SingerId: 1, AlbumId: 1, MarketingBudget: 100000
SingerId: 1, AlbumId: 2, MarketingBudget: 0
SingerId: 2, AlbumId: 1, MarketingBudget: 0
SingerId: 2, AlbumId: 2, MarketingBudget: 500000
SingerId: 2, AlbumId: 3, MarketingBudget: 0
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 executeUpdate()
.
Führen Sie das Beispiel mit dem Befehl write-data-with-dml-transaction
aus.
php spanner.php write-data-with-dml-transaction 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 kann mit Cloud Spanner ein Index hinzugefügt werden, ohne dass die Traffic-Bereitstellung unterbrochen werden muss. Cloud Spanner verwendet dann automatisch die vorhandenen Daten, um einen Backfill für den Index auszuführen. 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 Index-Backfill.
Nachdem Sie einen sekundären Index hinzugefügt haben, verwendet Cloud Spanner diesen automatisch für SQL-Abfragen, die mit dem Index sehr 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 in der Befehlszeile mithilfe des gcloud
-Befehlszeilentools oder programmatisch mithilfe der Cloud Spanner-Clientbibliothek für PHP 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)'
Es sollte dann Folgendes angezeigt werden:
Schema updating...done.
Mit Cloud Spanner-Clientbibliothek für PHP
Verwenden Sie Database::updateDdl
, um einen Index hinzuzufügen:
Führen Sie das Beispiel mit dem Befehl create-index
aus.
php spanner.php 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
Für SQL-Abfragen verwendet Cloud 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 die Methode Database::read
.
Führen Sie das Beispiel mit dem Befehl read-data-with-index
aus.
php spanner.php read-data-with-index test-instance example-db
Es sollte dann Folgendes angezeigt werden:
AlbumId: 2, AlbumTitle: Forever Hold your Peace
AlbumId: 2, AlbumTitle: Go, Go, Go
AlbumId: 1, AlbumTitle: Green
AlbumId: 3, AlbumTitle: Terrified
AlbumId: 1, AlbumTitle: Total Junk
Index mit einer STORING-Klausel hinzufügen
Vielleicht haben Sie bemerkt, dass im obigen Beispiel die Spalte MarketingBudget
nicht gelesen wird. Die Leseschnittstelle von Cloud Spanner unterstützt nicht die Möglichkeit, 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
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)'
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollte Folgendes angezeigt werden:
Schema updating...done.
Mit Cloud Spanner-Clientbibliothek für PHP
Verwenden SieDatabase::updateDdl
, um einen Index mit einer STORING
-Klausel hinzuzufügen:
Führen Sie das Beispiel mit dem Befehl create-storing-index
aus.
php spanner.php create-storing-index test-instance example-db
Es sollte dann Folgendes angezeigt werden:
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 Befehl read-data-with-storing-index
aus.
php spanner.php read-data-with-storing-index test-instance example-db
Die Ausgabe sollte in etwa so aussehen:
AlbumId: 2, AlbumTitle: Forever Hold your Peace, MarketingBudget: 300000
AlbumId: 2, AlbumTitle: Go, Go, Go, MarketingBudget: 0
AlbumId: 1, AlbumTitle: Green, MarketingBudget: 0
AlbumId: 3, AlbumTitle: Terrified, MarketingBudget: 0
AlbumId: 1, AlbumTitle: Total Junk, MarketingBudget: 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.
Zum Ausführen schreibgeschützter Transaktionen verwenden Sie ein Snapshot
-Objekt . Mit der Methode Database::snapshot
können Sie ein Snapshot
-Objekt abrufen.
So werden eine Abfrage und ein Lesevorgang in derselben schreibgeschützten Transaktion ausgeführt:
Führen Sie das Beispiel mit dem Befehl read-only-transaction
aus.
php spanner.php read-only-transaction test-instance example-db
Die Ausgabe sollte in etwa so aussehen:
Results from first read:
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
Results from second read:
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
Clean-up
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
Mit der Cloud Console
Rufen Sie in der Google Cloud Console die Seite Cloud 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
Mit der Cloud Console
Rufen Sie in der Google Cloud Console die Seite Cloud 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.