Lernziele
In dieser Anleitung werden Sie durch die folgenden Schritte mit Spanner geführt Clientbibliothek für C#:
- 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 für die Verwendung 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 C#-Umgebung vorbereiten
Legen Sie die Umgebungsvariable
GOOGLE_PROJECT_ID
auf Ihre Google Cloud-Projekt-ID fest.Legen Sie zuerst
GOOGLE_PROJECT_ID
für die aktuelle PowerShell-Sitzung fest:$env:GOOGLE_PROJECT_ID = "MY_PROJECT_ID"
Legen Sie dann
GOOGLE_PROJECT_ID
für alle Prozesse fest, die nach diesem Befehl erstellt wurden:[Environment]::SetEnvironmentVariable("GOOGLE_PROJECT_ID", "MY_PROJECT_ID", "User")
Laden Sie die Anmeldedaten herunter.
Rufen Sie in der Google Cloud Console die Seite Anmeldedaten auf.
Klicken Sie auf Anmeldedaten erstellen und wählen Sie Dienstkontoschlüssel aus.
Wählen Sie unter "Dienstkonto" Standardmäßiges Compute Engine-Dienstkonto aus und behalten Sie die Auswahl von JSON unter "Schlüsseltyp" bei. Klicken Sie auf Erstellen. Es wird eine JSON-Datei auf den Computer heruntergeladen.
Richten Sie die Anmeldedaten ein. Führen Sie für die Datei
FILENAME.json
, die sich auf dem LaufwerkC
im Verzeichnis "Downloads" vonCURRENT_USER
befindet, folgende Befehle aus, damitGOOGLE_APPLICATION_CREDENTIALS
auf den JSON-Schlüssel verweist:Legen Sie zuerst
GOOGLE_APPLICATION_CREDENTIALS
für diese PowerShell-Sitzung fest:$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\Users\CURRENT_USER\Downloads\FILENAME.json"
Legen Sie dann
GOOGLE_APPLICATION_CREDENTIALS
für alle Prozesse fest, die nach diesem Befehl erstellt werden:[Environment]::SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "C:\Users\CURRENT_USER\Downloads\FILENAME.json", "User")
Klonen Sie das Repository der Beispiel-App auf Ihren lokalen Computer:
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples
Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.
Öffnen Sie
Spanner.sln
im Verzeichnisdotnet-docs-samples\spanner\api
des heruntergeladenen Repositorys mit Visual Studio 2017 oder höher und erstellen Sie den zugehörigen Build.Wechseln Sie im heruntergeladenen Repository in das Verzeichnis, das die kompilierte Anwendung enthält. Beispiel:
cd dotnet-docs-samples\spanner\api\Spanner
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 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 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 finden Sie unter Knoten und Verarbeitungseinheiten.)
Hier sollten Sie dies sehen:
Creating instance...done.
Beispieldateien ansehen
Das Beispiel-Repository enthält ein Beispiel für die Verwendung von Spanner mit C#.
Sehen Sie sich das Spanner .NET GitHub-Repository an. Hier erfahren Sie, wie 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:
dotnet run createSampleDatabase $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie dies sehen:
Created sample database example-db on instance test-instance
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 eine SpannerConnection
erstellen:
Sie können sich einen SpannerConnection
wie eine Datenbankverbindung vorstellen: Alle Interaktionen mit Spanner müssen über einen SpannerConnection
ausgeführt werden.
Weitere Informationen finden Sie in der Referenz zu SpannerConnection
.
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 ExecuteNonQueryAsync()
.
Führen Sie das Beispiel mit dem Argument writeUsingDml
aus.
dotnet run writeUsingDml $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie dies sehen:
4 row(s) inserted...
Daten mit Mutationen schreiben
Sie können Daten auch mithilfe von Mutationen einfügen.
Sie können Daten mithilfe der Methode connection.CreateInsertCommand()
einfügen, wodurch ein neuer SpannerCommand
erstellt wird, um Zeilen in eine Tabelle einzufügen. Die Methode SpannerCommand.ExecuteNonQueryAsync()
fügt der Tabelle neue Zeilen hinzu.
Dieser Code zeigt, wie die Daten mithilfe von Mutationen eingefügt werden:
Führen Sie das Beispiel mit dem Argument insertSampleData
aus.
dotnet run insertSampleData $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie dies sehen:
Inserted data.
Daten mit SQL abfragen
Spanner unterstützt eine SQL-Oberfläche zum Lesen von Daten, auf die Sie in der Befehlszeile mit der Google Cloud CLI oder programmatisch mit der Spanner-Clientbibliothek für C# 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 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 C# verwenden
Als Alternative zum Ausführen einer SQL-Anweisung in der Befehlszeile können Sie die gleiche SQL-Anweisung programmgesteuert mithilfe der Spanner-Clientbibliothek für C# ausführen.
Führen Sie mit ExecuteReaderAsync()
die SQL-Abfrage aus.
So geben Sie die Abfrage aus und greifen auf die Daten zu:
dotnet run querySampleData $env:GOOGLE_PROJECT_ID test-instance example-db
Sie sollten dieses Ergebnis sehen:
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
Abfrage mit einem SQL-Parameter
Wenn in Ihrer Anwendung eine häufig ausgeführte Abfrage vorhanden ist, können Sie die Leistung durch Parameterisierung verbessern. Die resultierende parametrische Abfrage kann zwischengespeichert und wiederverwendet werden, wodurch die Kompilierungskosten reduziert werden. Weitere Informationen finden Sie unter Häufig ausgeführte Abfragen durch Abfrageparameter beschleunigen.
Im Folgenden finden Sie ein Beispiel für die Verwendung eines Parameters in der WHERE
-Klausel zum Abfragen von Datensätzen, die einen bestimmten Wert für LastName
enthalten.
So geben Sie die Abfrage mit einem Parameter aus und greifen auf die Daten zu:
dotnet run queryWithParameter $env:GOOGLE_PROJECT_ID test-instance example-db
Sie sollten dieses Ergebnis sehen:
SingerId : 12 FirstName : Melissa LastName : 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 eine Datenbank, während die
die Datenverkehrsdatenbank
weiterhin Traffic bereitstellt. Schemaaktualisierungen erfordern keine
die Datenbank offline sind und
nicht ganze Tabellen oder Spalten sperren; können Sie fortfahren
Daten während der Schemaaktualisierung in die Datenbank schreiben. Weitere Informationen zu unterstützten
Schemaaktualisierungen und Schemaänderungsleistung in
Schemaaktualisierungen vornehmen
Spalte hinzufügen
Sie können eine Spalte in der Befehlszeile mithilfe der Google Cloud CLI oder programmatischen über der Spanner-Clientbibliothek für C#.
Ü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 C# verwenden
Verwenden SieCreateDdlCommand()
, um das Schema zu ändern:
Führen Sie das Beispiel mit dem Befehl addColumn
aus.
dotnet run addColumn $env:GOOGLE_PROJECT_ID 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 er legt 500000
für den Zeilenschlüssel fest, der durch Albums(2, 2)
angegeben wird.
Führen Sie das Beispiel mit dem Befehl writeDataToNewColumn
aus.
dotnet run writeDataToNewColumn $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie das sehen:
Updated data.
Sie können auch eine SQL-Abfrage 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 queryNewColumn
aus.
dotnet run queryNewColumn $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie das sehen:
SingerId : 1 AlbumId : 1 MarketingBudget : 100000
SingerId : 1 AlbumId : 2 MarketingBudget :
SingerId : 2 AlbumId : 1 MarketingBudget :
SingerId : 2 AlbumId : 2 MarketingBudget : 500000
SingerId : 2 AlbumId : 3 MarketingBudget :
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 ExecuteNonQueryAsync()
.
Führen Sie das Beispiel mit dem Argument writeWithTransactionUsingDml
aus.
dotnet run writeWithTransactionUsingDml $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie dies 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. Gefällt mir andere Schemaaktualisierungen unterstützt, unterstützt Spanner das Hinzufügen eines Index, während der die Datenverkehrsdatenbank weiterhin Traffic bereitstellt. 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 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 in der Befehlszeile mithilfe der gcloud CLI oder programmgesteuert mithilfe der Spanner-Clientbibliothek für C# 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 dies sehen:
Schema updating...done.
Spanner-Clientbibliothek für C# verwenden
Verwenden Sie CreateDdlCommand()
, um einen Index hinzuzufügen:
Führen Sie das Beispiel mit dem Befehl addIndex
aus.
dotnet run addIndex $env:GOOGLE_PROJECT_ID test-instance example-db
Das Hinzufügen eines Index kann einige Minuten dauern. Nachdem der Index hinzugefügt wurde, sollte Folgendes angezeigt werden:
Added the AlbumsByAlbumTitle index.
Index für reine Index-Lesevorgänge hinzufügen
Vielleicht haben Sie bemerkt, dass im vorherigen Beispiel die Spalte MarketingBudget
nicht gelesen wird. Das liegt daran, dass die Leseschnittstelle von Spanner nicht die Möglichkeit unterstützt, 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 C# verwenden
Verwenden SieCreateDdlCommand()
, um einen Index mit einer STORING
-Klausel hinzuzufügen:
Führen Sie das Beispiel mit dem Befehl addStoringIndex
aus.
dotnet run addStoringIndex $env:GOOGLE_PROJECT_ID test-instance example-db
Hier sollten Sie das sehen:
Added the AlbumsByAlbumTitle2 index.
Jetzt können Sie einen Lesevorgang ausführen, der alle Spalten AlbumId
, AlbumTitle
und MarketingBudget
aus dem Index AlbumsByAlbumTitle2
abruft:
Lesen Sie die Daten mit dem von Ihnen erstellten Speicherindex. Führen Sie dazu eine Abfrage aus, in der der Index explizit angegeben wird:
Führen Sie das Beispiel mit dem Befehl queryDataWithStoringIndex
aus.
dotnet run queryDataWithStoringIndex $env:GOOGLE_PROJECT_ID 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 : 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 das .NET-Framework TransactionScope()
zusammen mit OpenAsReadOnlyAsync()
, um schreibgeschützte Transaktionen auszuführen.
So werden eine Abfrage und ein Lesevorgang in derselben schreibgeschützten Transaktion ausgeführt:
.NET Standard 2.0
.NET Standard 1.5
Führen Sie das Beispiel mit dem Befehl queryDataWithTransaction
aus.
dotnet run queryDataWithTransaction $env:GOOGLE_PROJECT_ID test-instance example-db
Die Ausgabe sollte in etwa so aussehen:
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
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
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
- Testen Sie das Vorschaurelease des Spanner-Datenbankanbieters für Entity Framework Core.
Informationen zu Anmeldedaten für die Autorisierung und Authentifizierung finden Sie unter Authentifizieren bei Cloud-Dienste mit Clientbibliotheken