Guida introduttiva a Cassandra tipi di dati CQL e utilizzo di GoCQL

Nella prima parte di questa serie di tutorial, ho trattato le basi di Cassandra e ho usato CQLSH per comunicare con il sistema di database tramite shell. In questa seconda parte, tratterò in breve i principali tipi di dati disponibili in CQL. Quindi parlerò degli elementi essenziali di gocql, un pacchetto client Golang che implementa il driver Cassandra per Golang. Tratterò come creare una connessione di sessione con Cassandra con alcune opzioni di configurazione e quindi come eseguire varie query utilizzando la sessione.

Cassandra fornisce supporto per i tipi di dati di base disponibili in quasi tutti i sistemi di database. Oltre a questo, fornisce anche tipi di raccolta complessi che possono memorizzare combinazioni di dati semplici sotto forma di elenco, set e mappa. Oltre a questo, CQL ha anche il supporto per i tipi definiti dall'utente, consentendo agli sviluppatori di avere i propri tipi di dati che sono facili da leggere e capire.

Tipi di dati di base

  • ASCII: Rappresenta una stringa di caratteri ASCII. L'inserimento di qualsiasi carattere non ASCII in una colonna di questo tipo causerebbe un errore.
  • bigint: Rappresenta una firma lunga a 64 bit. Usato per memorizzare numeri lunghi. Questo dovrebbe essere usato solo quando siamo sicuri di aver bisogno di numeri così lunghi perché questo occupa più spazio rispetto a int.
  • blob: Utilizzato per memorizzare byte arbitrari. Questo è rappresentato come esadecimale e qualsiasi dato senza alcuna convalida può essere memorizzato in questo campo.
  • booleano: I negozi vero o falso.
  • contatore: Rappresenta un numero intero con segno a 64 bit, ma non è possibile impostare il valore di questa colonna. Ci sono solo due operazioni su questa colonna, incremento e decremento. In una tabella con una colonna contatore, sono consentiti solo i tipi di contatore e la chiave primaria. Non ci sono INSERIRE istruzioni consentite in una tabella con colonna (e) contatore (i); solo AGGIORNARE può essere utilizzato. Per esempio:
> CREATE TABLE website_tracker (id int PRIMARY KEY, testo url, contatore visitatori_count); > UPDATE website_tracker SET visitor_count = visitor_count + 1 WHERE id = 1; > SELEZIONA * FROM website_tracker; id | url | conta ---- + ------ + ------ 1 | a.com | 1 (1 file)
  • Data: Rappresenta un valore data senza un valore temporale. Cassandra codifica come un valore intero dall'epoca. Le date possono essere rappresentate come stringhe in formato aaaa-mm-gg.
  • decimale: Rappresenta un valore decimale a precisione variabile. Ideale per memorizzare valuta o valori finanziari.
  • Doppio: Memorizza un valore in virgola mobile a 64 bit.
  • galleggiante: Memorizza un valore in virgola mobile a 32 bit.
  • inet: Rappresenta una stringa di indirizzo IP in formato IPv4 o IPv6.
  • Int: Rappresenta un numero intero con segno a 32 bit. Usato principalmente quando si memorizzano valori interi.
  • smallint: Rappresenta un numero intero a 2 byte (16 bit). Può essere preferito a int per memorizzare piccoli valori interi per risparmiare spazio.
  • testo: Rappresenta una stringa codificata UTF-8. Dovrebbe essere usato quando vogliamo memorizzare caratteri non ASCII.
  • tempo: Rappresenta un valore temporale. Rappresentato come una stringa nel formato 01: 02: 03,123 e numero intero con segno a 64 bit memorizzato che rappresenta i nanosecondi trascorsi da mezzanotte.
  • timestamp: Memorizza componenti di data e ora con precisione millisecondo. Può essere rappresentato come testo nel formato 2016-12-01 01: 02: 03.123.
  • tinyint: Rappresenta un numero intero a 1 byte (8 bit). Può essere preferito su int o smallint per memorizzare piccoli valori interi per risparmiare spazio.
  • timeuuid: Memorizza l'UUID versione 1.
  • uuid: UUID in formato standard. Questo è un valore maggiore rispetto a timeuuid.
  • varchar: Simile al testo. Entrambi possono essere usati in modo intercambiabile.
  • variante: Un valore intero con precisione arbitraria. Si consiglia di utilizzare un tipo di dati con la precisione richiesta.

Tipi di dati di raccolta

  • impostato: Questo tipo memorizza una raccolta di valori. I valori sono memorizzati come non ordinati, ma CQLSH li restituirebbe in modo ordinato. Ad esempio, le stringhe vengono ordinate alfabeticamente. Modifichiamo la tabella che abbiamo creato sopra:
> ALTER TABLE website_tracker AGGIUNGI tag Set 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'

È possibile utilizzare le consuete operazioni di set come differenza rimuovere elementi. Per cancellare o sostituire il set completo, fare SET tags = .

  • elenco: Un elenco memorizza anche una raccolta di valori ma li memorizza in modo ordinato, che è in base all'ordine di inserimento per impostazione predefinita. Proviamo a fare la stessa cosa che abbiamo fatto sopra con i set con una lista ora:
> ALTER TABLE website_tracker AGGIUNGI tag Elenco elenchi; > UPDATE website_tracker SET tagsList = ['tag1'] WHERE id = 1; > Seleziona tagLista FROM website_tracker WHERE id = 1; tagsList ---------- ['tag1']> UPDATE website_tracker SET tagsList = tagsList + ['gat2'] WHERE id = 1; > Seleziona tagLista FROM website_tracker WHERE id = 1; tagsList ------------------ ['tag1', 'gat2']

In una lista, i valori possono essere anteposti, sottratti (come nei set), inseriti / sostituiti / cancellati per valore di indice (SET tags [1] = ''), eccetera.

  • carta geografica: Una mappa contiene una raccolta di coppie chiave-valore. Questi possono essere qualsiasi cosa eccetto un tipo di contatore. Facciamo una piccola descrizione per ogni tag.
> ALTER TABLE website_tracker AGGIUNGI tagMappa mappa; > UPDATE website_tracker SET tagsMap = 'tag1': 'Tag One' WHERE id = 1; > SELEZIONA tagMappa FROM website_tracker WHERE id = 1; tagsMap ---------------------- 'tag1': 'Tag One'> UPDATE website_tracker SET tagsMap ['tag2'] = 'Tag Two' WHERE id = 1; > SELEZIONA tagMappa FROM website_tracker WHERE id = 1; tagsMap ------------------ 'tag1': 'Tag One', 'tag2': 'Tag Two'

Tipi di dati definiti dall'utente

È possibile in Cassandra definire i nostri tipi. Ciò offre molta flessibilità e facilita la manutenzione generale dei dati. Diciamo che vogliamo memorizzare l'indirizzo di registrazione del sito web.

> CREATE TYPE address (... testo di strada, ... testo di città, ... testo di stato); > ALTER TABLE website_tracker AGGIUNGI indirizzo reg_address;

Per utilizzare un tipo definito dall'utente in una raccolta nidificata, è necessario specificarlo come a congelato collezione.

> ALTER TABLE website_tracker AGGIUNGI mappa reg_addresses>;

Utilizzando GoCQL

Presumo che tu abbia una certa conoscenza dell'uso di Golang e della configurazione e installazione dei pacchetti.

Installazione

Per installare il gocql pacchetto, eseguire il seguente comando dalla shell:

$ vai su github.com/gocql/gocql

Ora creerò uno script Go che spiegherà i concetti necessari per capire gocql.

Scrivere lo script

main.go

pacchetto main import ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Fornire qui l'istanza del cluster cassandra. cluster: = gocql.NewCluster ("127.0.0.1") // L'autenticatore è necessario se l'autenticazione della password è // abilitata per l'installazione di Cassandra. Altrimenti, questo può essere rimosso. cluster.Authenticator = gocql.PasswordAuthenticator Username: "some_username", Password: "some_password", // gocql richiede che lo spazio per le chiavi venga fornito prima della creazione della sessione. // In futuro potrebbero esserci disposizioni per farlo più tardi. cluster.Keyspace = "keyspace_name" // Questo è il tempo dopo il quale la creazione della chiamata di sessione sarebbe scaduta. // Questo può essere personalizzato secondo necessità. cluster.Timeout = 5 * time.Second cluster.ProtoVersion = 4 session, err: = cluster.CreateSession () se err! = nil log.Fatalf ("Impossibile connettersi a cassandra cluster:% v", err) / / Controlla se la tabella esiste già. Crea se la tabella non esiste keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name") se _, esiste: = keySpaceMeta.Tables ["person"]; esiste! = true // Crea una sessione table.Query ("CREATE TABLE person (" + "id testo, nome testo, testo telefono," + "PRIMARY KEY (id))"). Exec () // DIY : Aggiorna la tabella con qualcosa se già esiste. // Inserisci record nella tabella utilizzando la sessione di istruzioni preparate. Query ("INSERT INTO person (id, name, phone) VALUES (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890"). Exec ( // FAI DA TE: aggiorna il record esistente // Seleziona il record ed esegui un po 'di processo sui dati recuperati var name string var phone string se err: = session.Query ("SELECT name, phone FROM person WHERE"). Scan (& name, & phone) ; err! = nil if err! = gocql.ErrNotFound log.Fatalf ("Query failed:% v", err) log.Printf ("Nome:% v", nome) log.Printf ("Telefono:% v ", phone) // Scarica più righe ed esegui il processo su di esse iter: = session.Query (" SELECT name, phone FROM person "). Iter () per iter.Scan (& name, & phone) log.Printf (" Nome Iter:% v ", nome) log.Printf (" Iter Phone:% v ", telefono) // DIY: Elimina record func main () PerformOperations () 

La maggior parte dei concetti di lavoro sono spiegati nel codice sopra riportato. Alcuni punti degni di nota sono le diverse operazioni utilizzate insieme a session.Query (). Oltre alle tre operazioni sottostanti, ce ne sono molte altre supportate che possono essere viste nella documentazione.

  • Exec (): Questo eseguirà semplicemente la query senza restituire alcuna riga. Restituisce errore se presente.
  • Scansione(): Questo eseguiva la query durante la copia dei valori delle colonne dalla prima riga abbinata nella query alle variabili passate. Scarterebbe qualsiasi riga separata dalla prima.
  • Iter (): Questo eseguiva la query e restituiva un iteratore che avrebbe funzionato come se fosse Scansione() funziona per ogni riga recuperata.

Esecuzione dello script

Per eseguire lo script, eseguire il comando di seguito in shell.

$ go run main.go 2017/02/03 12:53:40 Nome: Shalabh Aggarwal 2017/02/03 12:53:40 Telefono: 1234567890 2017/02/03 12:53:40 Iter Nome: Shalabh Aggarwal 2017 / 02/03 12:53:40 Iter Phone: 1234567890

Conclusione

In questa seconda parte di questa serie di tutorial, abbiamo trattato vari tipi di dati incorporati disponibili con Cassandra. Abbiamo anche visto come funzionano i tipi di raccolta e come i tipi definiti dall'utente possono essere utilizzati per rendere flessibile uno schema generale. Abbiamo anche visto come possiamo interagire con Cassandra a livello di codice in Golang usando gocql. Questo pacchetto offre molte più funzionalità che possono essere esplorate da soli.