Ziele
In dieser Anleitung werden Sie durch die folgenden Schritte mit dem Spanner ADO.NET-Treiber 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 vonGoogle Cloud. Informationen zu den Kosten für die Verwendung 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 ADO.NET-Umgebung vorbereiten
Laden Sie .NET auf Ihren Entwicklungscomputer herunter und installieren Sie es, falls es noch nicht installiert ist.
Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer:
git clone https://github.com/googleapis/dotnet-spanner-entity-framework.gitWechseln Sie in das Verzeichnis, das den ADO.NET-Treiber-Beispielcode für Spanner enthält:
cd dotnet-spanner-entity-framework/spanner-ado-net/spanner-ado-net-getting-started-guide
Instanz erstellen
Wenn Sie Spanner zum ersten Mal verwenden, müssen Sie eine Instanz erstellen. Dabei handelt es sich um 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.
Informationen zum Erstellen einer Spanner-Instanz mit einer der folgenden Methoden finden Sie unter Instanz erstellen. Sie können Ihre Instanz test-instance nennen, um sie mit anderen Themen in diesem Dokument zu verwenden, in denen auf eine Instanz mit dem Namen test-instance verwiesen wird.
- Google Cloud CLI
- Die Google Cloud Console
- Eine Clientbibliothek (C++, C#, Go, Java, Node.js, PHP, Python oder Ruby)
Beispieldateien ansehen
Das Beispiel-Repository enthält ein Beispiel für die Verwendung von Spanner mit ADO.NET.
Sehen Sie sich die DateiSampleRunner.cs genauer an. Darin wird die Verwendung von Spanner dargestellt. 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
dotnet run createtables projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run createtablespg projects/PROJECT_ID/instances/test-instance/databases/example-db
Im nächsten Schritt werden Daten in die Datenbank geschrieben.
Verbindung herstellen
Bevor Sie Lese- oder Schreibvorgänge ausführen können, müssen Sie eine Verbindung herstellen, um mit Spanner zu interagieren. Der Datenbankname und andere Verbindungseigenschaften werden im ADO.NET-Verbindungsstring 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 Methode DbCommand#ExecuteNonQuery.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run dmlwritepg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis sollte so aussehen:
4 records inserted.
Daten mit Mutationen schreiben
Sie können Daten auch mithilfe von Mutationen einfügen.
Sie können Daten mit der Methode batch.CreateInsertCommand() einfügen. Dadurch wird ein neuer SpannerBatchCommand erstellt, um Zeilen in eine Tabelle einzufügen.
Mit der Methode SpannerBatchCommand.ExecuteNonQueryAsync() werden der Tabelle neue Zeilen hinzugefügt.
Der folgende Code zeigt, wie Daten mithilfe von Mutationen geschrieben werden:
GoogleSQL
PostgreSQL
Führen Sie das folgende Beispiel mit dem Argument write aus:
GoogleSQL
dotnet run write projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writepg projects/PROJECT_ID/instances/test-instance/databases/example-db
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 dem Spanner ADO.NET-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'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
Das Ergebnis zeigt:
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-ADO.NET-Treiber verwenden
Als Alternative zum Ausführen einer SQL-Anweisung in der Befehlszeile können Sie die gleiche SQL-Anweisung programmgesteuert mithilfe des Spanner ADO.NET-Treibers ausführen.
Die folgenden Methoden werden zum Ausführen einer SQL-Abfrage verwendet:- Die Methode
ExecuteReaderin der KlasseDbCommand: Verwenden Sie diese Methode, um eine SQL-Anweisung auszuführen, die Zeilen zurückgibt, z. B. eine Abfrage oder eine DML-Anweisung mit einerTHEN RETURN-Klausel. - Die Klasse
DbDataReader: Mit dieser Klasse können Sie auf die von einer SQL-Anweisung zurückgegebenen Daten zugreifen.
Im folgenden Beispiel wird die Methode ExecuteReaderAsync verwendet:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run query projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querypg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis sollte so aussehen:
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 die Leistung verbessern, indem Sie sie parametrisieren. 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.
Der Spanner ADO.NET-Treiber unterstützt sowohl positionale als auch benannte Abfrageparameter. Ein ? in einer SQL-Anweisung gibt einen Positionsabfrageparameter an. Fügen Sie dem Parameters des DbCommand Abfrageparameterwerte hinzu. Beispiel:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querywithparameterpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt:
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 während der Schemaänderung finden Sie unter Schema aktualisieren.
Spalte hinzufügen
Sie können eine Spalte in der Befehlszeile mithilfe der Google Cloud CLI oder programmatisch mithilfe des Spanner ADO.NET-Treibers 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-ADO.NET-Treiber verwenden
Verwenden Sie die MethodeExecuteNonQueryAsync, um das Schema zu ändern:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run addcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run addcolumnpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt:
Added MarketingBudget column.
DDL-Batch ausführen
Wir empfehlen, mehrere Schemaänderungen in einem Batch auszuführen. Verwenden Sie die ADO.NET-Methode CreateBatch, um einen Batch zu erstellen. Im folgenden Beispiel werden zwei Tabellen in einem Batch erstellt:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run ddlbatch projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run ddlbatchpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt:
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
dotnet run update projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run updatepg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt:
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 Methode ExecuteReaderAsync verwendet, um eine Abfrage auszuführen:
GoogleSQL
PostgreSQL
Führen Sie zum Ausführen dieser Abfrage den folgenden Befehl aus:
GoogleSQL
dotnet run querymarketingbudget projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run 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 connection.BeginTransactionAsync() auf, um Lese-/Schreibtransaktionen in ADO.NET auszuführen.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run writewithtransactionusingdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writewithtransactionusingdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Transaktions- und Anfrage-Tags
Verwenden Sie Transaktions- und Anfrage-Tags, um Fehler bei Transaktionen und Abfragen in Spanner zu beheben. Sie können Tags für Transaction-Objekte festlegen, um Transaktions-Tags zu senden, und für DbCommand-Objekte, um Anfrage-Tags an Spanner zu senden. Beispiel:
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run tags projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run 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.
Rufen Sie connection.BeginReadOnlyTransactionAsync() auf, 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
dotnet run readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run readonlytransactionpg projects/PROJECT_ID/instances/test-instance/databases/example-db
Das Ergebnis zeigt:
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 DML
Die partitionierte Datenbearbeitungssprache (Data Manipulation Language, DML) wurde für die folgenden Arten von Bulk-Aktualisierungen und ‑Löschvorgängen entwickelt:
- Regelmäßige und automatische Speicherbereinigungsvorgänge.
- Backfilling neuer Spalten mit Standardwerten.
GoogleSQL
PostgreSQL
Führen Sie das Beispiel mit dem folgenden Befehl aus:
GoogleSQL
dotnet run pdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run 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
Informationen zu Anmeldedaten für die Autorisierung und Authentifizierung finden Sie unter Mithilfe von Clientbibliotheken bei Cloud-Diensten authentifizieren.
Best Practices für Schemadesign in Spanner