Noțiuni de bază cu Cassandra Tipuri de date CQL și Utilizarea GoCQL

În prima parte a acestei serii de tutorial am acoperit foarte multe elemente de bază ale Cassandrei și am folosit CQLSH pentru a comunica cu sistemul de baze de date prin shell. În această a doua parte, voi prezenta pe scurt principalele tipuri de date disponibile în CQL. Apoi voi acoperi esențele lui gocql, un pachet client Golang care implementează driverul Cassandra pentru Golang. Voi descrie cum să creați o conexiune de sesiune cu Cassandra cu câteva opțiuni de configurare și apoi să rulați diverse interogări utilizând sesiunea.

Cassandra oferă suport pentru tipurile de date de bază care sunt disponibile în aproape toate sistemele de baze de date. În afară de aceasta, oferă și tipuri de colecții complexe care pot stoca combinații de date simple sub formă de listă, set și hartă. În afară de aceasta, CQL are, de asemenea, suport pentru tipurile definite de utilizator, permițând dezvoltatorilor să aibă propriile tipuri de date care sunt ușor de citit și de înțeles.

Tipuri de date de bază

  • ascii: Reprezintă un șir de caractere ASCII. Introducerea oricărui caracter non-ASCII într-o coloană de acest tip ar duce la o eroare.
  • BIGINT: Reprezintă o lungă semnată pe 64 de biți. Folosit pentru stocarea numerelor lungi. Acest lucru ar trebui să fie folosit numai atunci când suntem siguri că avem nevoie de un număr atât de lung, deoarece ocupă mai mult spațiu în comparație cu int.
  • pată de cerneală: Se folosește pentru a stoca octeți arbitrari. Acesta este reprezentat ca hexazecimal și orice date fără validare pot fi stocate în acest câmp.
  • boolean: Magazine Adevărat sau fals.
  • tejghea: Reprezintă un număr întreg semnat pe 64 de biți, însă valoarea acestei coloane nu poate fi setată. Există doar două operații în această coloană, creștere și scădere. Într-un tabel cu o coloană contra, sunt permise numai tipurile de contoare și cheia primară. Nu sunt INTRODUCE instrucțiuni permise într-un tabel cu coloană (coloane) contra; numai ACTUALIZAȚI poate fi utilizat. De exemplu:
> Crearea tabelului site_tracker (id int KEY PRIMARY, text url, număr de vizitator_count); > UPDATE site_tracker SET visitor_count = vizitator_count + 1 WHERE id = 1; > SELECT * FROM site-ul web; id | url | numărătoare ---- + ------ + ------ 1 | a.com | 1 (1 rânduri)
  • Data: Reprezintă o valoare de dată fără o valoare de timp. Cassandra codifică la fel ca o valoare întregă din epocă. Datele pot fi reprezentate ca șiruri în format aaaa-ll-zz.
  • zecimal: Reprezintă o valoare zecimală cu precizie variabilă. Cel mai bun pentru stocarea valorilor monetare sau financiare.
  • dubla: Stochează o valoare de virgulă mobilă pe 64 biți.
  • pluti: Stochează o valoare de virgulă mobilă pe 32 biți.
  • inet: Reprezintă un șir de adrese IP în format IPv4 sau IPv6.
  • int: Reprezintă un întreg cu semn pe 32 de biți. Se folosește mai ales atunci când se stochează valori întregi.
  • smallint: Reprezintă un număr întreg de 2 octeți (16 biți). Poate fi preferat peste int pentru stocarea unor valori întregi mici pentru a economisi spațiu.
  • text: Reprezintă un șir codificat în UTF-8. Ar trebui să fie utilizate atunci când dorim să stocăm caractere non-ASCII.
  • timp: Reprezintă o valoare de timp. Reprezentat ca un șir în format 01: 02: 03.123 și stocate întregul număr semnal pe 64 de biți, care reprezintă nanosecunde scoase din miezul nopții.
  • timestamp-ul: Stochează atât componentele datei cât și cele de timp cu precizie de milisecunde. Pot fi reprezentate ca text în format 2016-12-01 01: 02: 03.123.
  • tinyint: Reprezintă un număr întreg de 1 byte (8 biți). Poate fi preferat peste int sau smallint pentru stocarea unor valori întregi mici pentru a economisi spațiu.
  • timeuuid: Stochează versiunea 1 UUID.
  • UUID: UUID în format standard. Aceasta este o valoare mai mare în comparație cu cea temporară.
  • varchar: Similar cu textul. Ambele pot fi folosite interschimbabil.
  • variantă: O valoare întregă cu precizie arbitrară. Se recomandă utilizarea unui tip de date cu precizia necesară.

Tipurile de date de colectare

  • a stabilit: Acest tip stochează o colecție de valori. Valorile sunt stocate ca neordonate, dar CQLSH le va returna într-un mod sortat. De exemplu, șirurile vor fi sortate în ordine alfabetică. Să modificăm masa pe care am creat-o mai sus:
> ALTER TABLE site_tracker ADD tagsSet set; > UPDATE site_tracker SET tagSet = 'tag1' WHERE id = 1; > Tagurile SELECTSet FROM site_tracker WHERE id = 1; tagSet ---------- 'tag1'> UPDATE site_tracker SET taguriSet = tagsSet + 'gat2' WHERE id = 1; > Tagurile SELECTSet FROM site_tracker WHERE id = 1; tagsSet ------------------ 'gat2', 'tag1'

Puteți utiliza operațiile de setare obișnuite, cum ar fi diferență pentru a elimina elementele. Pentru a șterge sau înlocui setul complet, faceți SET tags = .

  • listă: O listă stochează, de asemenea, o colecție de valori, dar le stochează în mod comandat, care este în ordinea inserării în mod implicit. Să încercăm să facem același lucru pe care l-am făcut mai sus cu seturi cu o listă acum:
> ALTER TABLE site_tracker ADD tagsList list; > UPDATE site_tracker SET tagsList = ['tag1'] WHERE id = 1; > SELECT tagsList din site_tracker WHERE id = 1; tagsList ---------- ['tag1']> UPDATE site_tracker SET tag-uriList = tagsList + ['gat2'] WHERE id = 1; > SELECT tagsList din site_tracker WHERE id = 1; tagsList ------------------ ['tag1', 'gat2']

Într-o listă, valorile pot fi prefixate, scăzute (ca în seturi), inserate / înlocuite / șterse după valoarea indexului (SET tag-uri [1] = ''), etc.

  • Hartă: O hartă conține o colecție de perechi cheie-valoare. Acestea pot fi orice, cu excepția unui tip de contor. Să prezentăm o mică descriere pentru fiecare etichetă.
> ALTER TABLE site_tracker ADD tagsMap map; > UPDATE site_tracker SET tagMap = 'tag1': 'Tag One' WHERE id = 1; > SELECT tag-uriMap FROM site_tracker WHERE id = 1; tagsMap ---------------------- 'tag1': 'Tag One'> UPDATE site_tracker SET tag-uri ['tag2'] = 'Tag Two' WHERE id = 1; > SELECT tag-uriMap FROM site_tracker WHERE id = 1; tagsMap ------------------ 'tag1': 'Tag One', 'tag2': 'Tag Two'

Tipuri de date definite de utilizator

Este posibil în Cassandra să ne definim propriile noastre tipuri. Acest lucru oferă o mare flexibilitate și facilitează întreținerea generală a datelor. Să presupunem că dorim să stocăm adresa de înregistrare a site-ului web.

> Adresa CREATE TYPE (... text de stradă, ... text de oraș, ... text de stare); > ALTER TABLE site_tracker ADD adresă reg_address;

Pentru a utiliza un tip definit de utilizator într-o colecție imbricată, trebuie să îl specificăm ca o îngheţat Colectie.

> ALTER TABLE site_tracker ADD reg_addresses hartă>;

Utilizarea GoCQL

Presupun că aveți cunoștințe despre utilizarea lui Golang și configurarea și instalarea pachetelor.

Instalare

Pentru a instala gocql pachet, executați următoarea comandă din shell:

$ go get github.com/gocql/gocql

Acum voi crea un script Go, care va explica conceptele necesare pentru a înțelege gocql.

Scrierea scriptului

main.go

importul pachetului principal ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Furnizați aici instanța clusterului cassandra. cluster: = gocql.NewCluster ("127.0.0.1") // Autentificatorul este necesar dacă autentificarea parolei este activată pentru instalarea dvs. Cassandra. Dacă nu, acest lucru poate fi eliminat. cluster.Authenticator = gocql.PasswordAuthenticator Nume de utilizator: "some_username", Parola: "some_password", // gocql cere ca spațiul de chei să fie furnizat înainte de crearea sesiunii. În viitor ar putea exista dispoziții pentru a face acest lucru mai târziu. cluster.Keyspace = "keyspace_name" // Acesta este timpul după care crearea unui apel de sesiune ar fi expirat. // Aceasta poate fi personalizată după cum este necesar. cluster.Timeout = 5 * time.Second cluster.ProtoVersion = 4 sesiune, err: = cluster.CreateSession () dacă err! = nil log.Fatalf ("Nu s-a putut conecta la clusterul cassandra:% v", err) / Verificați dacă tabela există deja. Creați dacă tabelul nu există keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name") dacă _, există: = keySpaceMeta.Tables ["person"]; există! = true // Creați o sesiune de tabelă.Query ("CREATE TABLE person (" + text id, text nume, text telefon, "+" PRIMARY KEY (id) : Actualizați tabelul cu ceva dacă există deja. // Inserați înregistrarea în tabel utilizând instrucțiunile pregătite session.Query ("INSERT INTO person (id, nume, telefon) VALUES (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890" ) // DIY: Actualizați înregistrarea existentă // Selectați înregistrarea și executați un proces pe datele obținute var var șir var var șir de telefon dacă err: = session.Query ("SELECT nume, telefon FROM WHERE") Scan (& nume, & telefon) ; err! = nil if err! = gocql.ErrNotFound log.Fatalf ("Query failed:% v", err) log.Printf ("Nume:% v" v ", telefon) / / Fetch mai multe rânduri și rulați procesul peste ele iter: = session.Query (" SELECT name, phone FROM person ") Iter () pentru iter.Scan (& name, & phone) log.Printf (" Iter Nume:% v ", nume) log.Printf (" Iter Phone:% v ", telefon) // DIY: Ștergeți înregistrarea func main () PerformOperations 

Cele mai multe dintre conceptele de lucru sunt explicate în codul de mai sus. Unele puncte care merită notate sunt diferitele operațiuni utilizate împreună cu session.Query (). În afară de cele trei operații de mai jos, sunt mult mai multe susținute care pot fi văzute în documentație.

  • Exec (): Aceasta ar executa interogarea fără a returna rânduri. Returnează eroarea dacă există.
  • Scan (): Aceasta ar executa interogarea în timp ce se copiază valorile coloanelor din primul rând, potrivite în interogare, cu variabilele transmise. Ar arunca orice rânduri în afară de primul.
  • Iter (): Aceasta ar executa interogarea și va returna un iterator care ar putea funcționa doar cum ar fi cum Scan () lucrează pentru fiecare rând încasat.

Rularea scriptului

Pentru a executa scriptul, executați comanda de mai jos în coajă.

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

Concluzie

În această a doua parte a acestei serii de tutorial am acoperit diverse tipuri de date încorporate disponibile cu Cassandra. De asemenea, am văzut cum funcționează tipurile de colecții și cum pot fi utilizate tipurile definite de utilizator pentru a face o schemă globală flexibilă. De asemenea, am văzut cum putem interacționa cu Cassandra programabil în Golang folosind gocql. Acest pachet oferă o mult mai multă funcționalitate care poate fi explorată pe cont propriu.

Cod