Erste Schritte mit Cassandra CQL-Datentypen und Verwendung von GoCQL

Im ersten Teil dieser Tutorialserie habe ich die Grundlagen von Cassandra behandelt und CQLSH verwendet, um über eine Shell mit dem Datenbanksystem zu kommunizieren. In diesem zweiten Teil werde ich kurz die wichtigsten in CQL verfügbaren Datentypen behandeln. Dann werde ich auf das Wesentliche eingehen gocql, ein Golang-Client-Paket, das den Cassandra-Treiber für Golang implementiert. Ich werde darauf eingehen, wie Sie eine Sitzungsverbindung mit Cassandra mit einigen Konfigurationsoptionen erstellen und anschließend verschiedene Abfragen mit der Sitzung ausführen.

Cassandra bietet Unterstützung für grundlegende Datentypen, die in fast allen Datenbanksystemen verfügbar sind. Darüber hinaus bietet es auch komplexe Sammlungstypen, in denen Kombinationen einfacher Daten in Form von Liste, Mengen und Karten gespeichert werden können. Darüber hinaus unterstützt CQL auch benutzerdefinierte Typen, sodass Entwickler über eigene Datentypen verfügen, die leicht lesbar und verständlich sind.

Grunddatentypen

  • ASCII: Stellt eine Zeichenfolge aus ASCII-Zeichen dar. Das Einfügen von Nicht-ASCII-Zeichen in eine Spalte dieses Typs führt zu einem Fehler.
  • bigint: Repräsentiert eine 64-Bit-Länge mit Vorzeichen. Wird verwendet, um lange Zahlen zu speichern. Dies sollte nur verwendet werden, wenn wir sicher sind, dass wir so lange Zahlen benötigen, da dies im Vergleich zu mehr Platz benötigt int.
  • Klecks: Wird zum Speichern beliebiger Bytes verwendet. Dies wird als hexadezimal dargestellt, und alle Daten ohne Validierung können in diesem Feld gespeichert werden.
  • boolean: Shops wahr oder falsch.
  • Zähler: Stellt eine 64-Bit-Ganzzahl mit Vorzeichen dar, der Wert dieser Spalte kann jedoch nicht festgelegt werden. Es gibt nur zwei Vorgänge in dieser Spalte: Inkrementieren und Dekrementieren. In einer Tabelle mit einer Zählerspalte sind nur Zählertypen und Primärschlüssel zulässig. Es gibt keine EINFÜGEN Anweisungen, die in einer Tabelle mit Zählerspalten zulässig sind; nur AKTUALISIEREN kann verwendet werden. Zum Beispiel:
> CREATE TABLE website_tracker (id int PRIMARY KEY, URL-Text, Besucherzähler); > UPDATE website_tracker SET besucherzahl = besucherzahl + 1 WHERE id = 1; > SELECT * FROM website_tracker; id | url | count ---- + ------ + ------ 1 | a.com | 1 (1 Reihen)
  • Datum: Stellt einen Datumswert ohne Zeitwert dar. Cassandra codiert dasselbe wie einen ganzzahligen Wert seit der Epoche. Datumsangaben können als Zeichenfolgen im Format dargestellt werden JJJJ-MM-TT.
  • Dezimal: Stellt einen Dezimalwert mit variabler Genauigkeit dar. Am besten zum Speichern von Währungen oder finanziellen Werten.
  • doppelt: Speichert einen 64-Bit-Gleitkommawert.
  • schweben: Speichert einen 32-Bit-Gleitkommawert.
  • Inet: Stellt eine IP-Adresszeichenfolge im IPv4- oder IPv6-Format dar.
  • int: Repräsentiert eine 32-Bit-Ganzzahl mit Vorzeichen. Wird hauptsächlich verwendet, wenn Ganzzahlwerte gespeichert werden.
  • smallint: Repräsentiert eine 2-Byte-Ganzzahl (16 Bit). Kann gegenüber int vorgezogen werden, um kleine Integerwerte zu speichern, um Platz zu sparen.
  • Text: Repräsentiert eine UTF-8-codierte Zeichenfolge. Sollte verwendet werden, wenn Nicht-ASCII-Zeichen gespeichert werden sollen.
  • Zeit: Stellt einen Zeitwert dar. Wird als Zeichenfolge im Format dargestellt 01: 02: 03.123 und eine vorzeichenbehaftete 64-Bit-Ganzzahl, die seit Mitternacht vergangene Nanosekunden darstellt.
  • Zeitstempel: Speichert Datums- und Zeitkomponenten mit einer Genauigkeit von Millisekunden. Kann als Text im Format dargestellt werden 2016-12-01 01: 02: 03.123.
  • tinyint: Repräsentiert eine 1-Byte-Ganzzahl (8-Bit). Kann gegenüber int oder smallint vorgezogen werden, um kleine Integerwerte zu speichern, um Platz zu sparen.
  • timeuuid: Speichert die UUID der Version 1.
  • uuid: UUID im Standardformat. Dies ist ein größerer Wert im Vergleich zu timeuuid.
  • varchar: Ähnlich wie Text. Beide können austauschbar verwendet werden.
  • Variante: Ein ganzzahliger Wert mit beliebiger Genauigkeit. Es wird empfohlen, einen Datentyp mit der erforderlichen Genauigkeit zu verwenden.

Erfassungsdatentypen

  • einstellen: Dieser Typ speichert eine Sammlung von Werten. Die Werte werden als ungeordnet gespeichert, aber CQLSH gibt sie sortiert zurück. Zum Beispiel werden Zeichenfolgen alphabetisch sortiert. Ändern wir die oben erstellte Tabelle:
> ALTER TABLE website_tracker ADD tagsSet set; > UPDATE website_tracker SET tagsSet = 'tag1' WHERE id = 1; > SELECT tagsSet FROM website_tracker WHERE id = 1; tagsSet ---------- 'tag1'> UPDATE website_tracker SET tagsSet = tagsSet + 'gat2' WHERE id = 1; > SELECT tagsSet FROM website_tracker WHERE id = 1; tagsSet ------------------ 'gat2', 'tag1'

Sie können die üblichen Set-Operationen wie verwenden Unterschied Elemente entfernen. Um das komplette Set zu löschen oder auszutauschen, tun Sie SET-Tags = .

  • Liste: Eine Liste speichert auch eine Sammlung von Werten, speichert sie jedoch in geordneter Reihenfolge (standardmäßig in der Reihenfolge des Einfügens). Versuchen wir, dasselbe zu tun, was wir oben mit Sets mit einer Liste gemacht haben:
> ALTER TABLE website_tracker ADD-TagsList-Liste; > UPDATE website_tracker SET tagsList = ['tag1'] WHERE id = 1; > SELECT tagsList FROM website_tracker WHERE id = 1; tagsList ---------- ['tag1']> UPDATE website_tracker SET tagsList = tagsList + ['gat2'] WHERE id = 1; > SELECT tagsList FROM website_tracker WHERE id = 1; tagsList ------------------ ['tag1', 'gat2']

In einer Liste können Werte vorangestellt, subtrahiert (wie in Sätzen), nach Indexwert eingefügt / ersetzt / gelöscht werden (SET-Tags [1] = ''), usw.

  • Karte: Eine Karte enthält eine Sammlung von Schlüsselwertpaaren. Dies kann alles außer einem Zählertyp sein. Lassen Sie uns für jedes Tag eine kleine Beschreibung haben.
> ALTER TABLE website_tracker ADD tagsMap-Karte; > UPDATE website_tracker SET tagsMap = 'tag1': 'Tag One' WHERE id = 1; > SELECT tagsMap FROM website_tracker WHERE id = 1; tagsMap ---------------------- 'tag1': 'Tag One'> UPDATE website_tracker SET tagsMap ['tag2'] = 'Tag zwei' WHERE id = 1; > SELECT tagsMap FROM website_tracker WHERE id = 1; tagsMap ------------------ 'tag1': 'Tag eins', 'tag2': 'Tag zwei'

Benutzerdefinierte Datentypen

In Cassandra ist es möglich, unsere eigenen Typen zu definieren. Dies gibt viel Flexibilität und vereinfacht die allgemeine Datenpflege. Angenommen, wir möchten die Registrierungsadresse der Website speichern.

> CREATE TYPE-Adresse (… Straßentext,… Stadttext,… Zustandstext); > ALTER TABLE website_tracker ADD reg_address address;

Um einen benutzerdefinierten Typ in einer verschachtelten Auflistung verwenden zu können, müssen Sie ihn als angeben gefroren Sammlung.

> ALTER TABLE website_tracker ADD reg_addresses map>;

GoCQL verwenden

Ich gehe davon aus, dass Sie über Kenntnisse in der Verwendung von Golang sowie über das Konfigurieren und Installieren von Paketen verfügen.

Installation

So installieren Sie das gocql Führen Sie den folgenden Befehl aus der Shell aus:

$ go github.com/gocql/gocql abrufen

Jetzt werde ich ein Go-Skript erstellen, das die zum Verständnis erforderlichen Konzepte erläutert gocql.

Das Skript schreiben

main.go

Paket-Hauptimport ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Geben Sie hier die cassandra cluster-Instanz an. cluster: = gocql.NewCluster ("127.0.0.1") // Der Authentifikator ist erforderlich, wenn die // Kennwortauthentifizierung für Ihre Cassandra-Installation aktiviert ist. Wenn nicht, kann dies // entfernt werden. cluster.Authenticator = gocql.PasswordAuthenticator Benutzername: "some_username", Kennwort: "some_password", // Für gocql muss der Schlüsselbereich angegeben werden, bevor die Sitzung erstellt wird. // Möglicherweise gibt es in Zukunft Bestimmungen, um dies später zu tun. cluster.Keyspace = "keyspace_name" // Dies ist der Zeitpunkt, nach dessen Ablauf das Erstellen des Sitzungsaufrufs abläuft. // Dies kann nach Bedarf angepasst werden. cluster.Timeout = 5 * time.econd cluster.ProtoVersion = 4 Sitzung, err: = cluster.CreateSession () if err! = nil log.Fatalf ("Verbindung zu Cassandra-Cluster konnte nicht hergestellt werden:% v", err) / / Prüfen Sie, ob die Tabelle bereits existiert. Erstellen, wenn die Tabelle nicht vorhanden ist keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name"), wenn _, vorhanden ist: = keySpaceMeta.Tables ["person"]; exists! = true // Erzeuge eine Tabelle session.Query ("CREATE TABLE person" ("+" ID-Text, Name, Telefontext, "+" PRIMARY KEY (id)) "). Exec () // DIY : Aktualisieren Sie die Tabelle mit etwas, falls es bereits existiert. // Einfügen eines Datensatzes in die Tabelle mit den vorbereiteten Anweisungen session.Query ("INSERT INTO person (id, name, phone) VALUES (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890"). Exec ( ) // DIY: Vorhandenen Datensatz aktualisieren // Datensatz auswählen und einen Prozess für die abgerufenen Daten ausführen. Name der Zeichenfolge var Telefonzeichenfolge, wenn err: = session.Query ("SELECT name, phone FROM person WHERE"). Scannen (& name, & phone) ; err! = nil if err! = gocql.ErrNotFound log.Fatalf ("Abfrage fehlgeschlagen:% v", err) log.Printf ("Name:% v", Name) log.Printf ("Telefon:% v ", phone) // Mehrere Zeilen abrufen und Prozess über sie ausführen iter: = session.Query (" SELECT name, phone FROM person "). Iter () für iter.Scan (& name, & phone) log.Printf (" Iter Name:% v ", Name) log.Printf (" Iter Phone:% v ", Telefon) // DIY: Datensatz löschen func main () PerformOperations () 

Die meisten Arbeitskonzepte werden im obigen Code selbst erläutert. Einige erwähnenswerte Punkte sind die verschiedenen Operationen, die zusammen mit verwendet werden session.Query (). Abgesehen von den drei folgenden Vorgängen werden viele weitere unterstützt, die in der Dokumentation zu sehen sind.

  • Exec (): Dadurch würde die Abfrage nur ausgeführt, ohne Zeilen zurückzugeben. Gibt einen Fehler zurück, falls vorhanden.
  • Scan(): Dies würde die Abfrage ausführen, während die Werte der Spalten aus der ersten in der Abfrage übereinstimmenden Zeile in die übergebenen Variablen kopiert wurden. Es würde alle Reihen außer der ersten verwerfen.
  • Iter (): Dies würde die Abfrage ausführen und einen Iterator zurückgeben, der dann wie funktioniert Scan() funktioniert für jede abgerufene Zeile.

Skript ausführen

Um das Skript auszuführen, führen Sie den folgenden Befehl in der Shell aus.

$ go run main.go 2017/02/03 12:53:40 Name: Shalabh Aggarwal 2017/02/03 12:53:40 Telefon: 1234567890 2017/02/03 12:53:40 Iter Name: Shalabh Aggarwal 2017 / 02/03 12:53:40 Iter Telefon: 1234567890

Fazit

In diesem zweiten Teil dieser Tutorialserie haben wir verschiedene integrierte Datentypen behandelt, die mit Cassandra verfügbar sind. Wir haben auch gesehen, wie Sammlungsarten funktionieren und wie benutzerdefinierte Typen verwendet werden können, um ein Gesamtschema flexibel zu gestalten. Wir haben auch gesehen, wie wir in Golang mit gocql programmatisch mit Cassandra interagieren können. Dieses Paket bietet viel mehr Funktionen, die Sie selbst erkunden können.