Premiers pas avec Cassandra types de données CQL et utilisation de GoCQL

Dans la première partie de cette série de didacticiels, j'ai présenté les bases de Cassandra et utilisé CQLSH pour communiquer avec le système de base de données via un shell. Dans cette seconde partie, je couvrirai brièvement les principaux types de données disponibles dans CQL. Ensuite, je couvrirai l'essentiel de gocql, un package client Golang qui implémente le pilote Cassandra pour Golang. Je vais expliquer comment créer une connexion de session avec Cassandra avec quelques options de configuration, puis comment exécuter diverses requêtes à l'aide de la session..

Cassandra prend en charge les types de données de base disponibles dans presque tous les systèmes de base de données. En plus de cela, il fournit également des types de collection complexes pouvant stocker des combinaisons de données simples sous forme de liste, de jeu et de carte. En dehors de cela, CQL prend également en charge les types définis par l'utilisateur, ce qui permet aux développeurs de disposer de leurs propres types de données, faciles à lire et à comprendre..

Types de données de base

  • ascii: Représente une chaîne de caractères ASCII. L'insertion de tout caractère non-ASCII dans une colonne de ce type entraînerait une erreur.
  • bigint: Représente une signature longue 64 bits. Utilisé pour stocker des numéros longs. Cela ne devrait être utilisé que lorsque nous sommes sûrs d'avoir besoin de chiffres aussi longs, car cela occupe plus d'espace que int.
  • goutte: Utilisé pour stocker des octets arbitraires. Ceci est représenté sous forme hexadécimale et toute donnée sans validation peut être stockée dans ce champ.
  • booléen: Magasins vrai ou faux.
  • compteur: Représente un entier signé 64 bits, mais la valeur de cette colonne ne peut pas être définie. Il n'y a que deux opérations sur cette colonne, incrémenter et décrémenter. Dans une table avec une colonne de compteur, seuls les types de compteur et la clé primaire sont autorisés. Il n'y a pas INSÉRER instructions autorisées dans une table avec une ou plusieurs colonnes de compteur; seulement METTRE À JOUR peut être utilisé. Par exemple:
> CREATE TABLE website_tracker (id int PRIMARY KEY, texte de l'URL, compteur visiteur_count); > UPDATE website_tracker SET visiteur_count = visiteur_compte + 1 WHERE id = 1; > SELECT * FROM website_tracker; id | url | compter ---- + ------ + ------ 1 | a.com | 1 (1 rangées)
  • rendez-vous amoureux: Représente une valeur de date sans valeur d'heure. Cassandra code comme une valeur entière depuis epoch. Les dates peuvent être représentées sous forme de chaînes au format aaaa-mm-jj.
  • décimal: Représente une valeur décimale à précision variable. Idéal pour stocker des devises ou des valeurs financières.
  • double: Stocke une valeur à virgule flottante de 64 bits.
  • flotte: Stocke une valeur à virgule flottante 32 bits.
  • inet: Représente une chaîne d'adresse IP au format IPv4 ou IPv6.
  • int: Représente un entier signé 32 bits. Utilisé principalement pour stocker des valeurs entières.
  • smallint: Représente un entier de 2 octets (16 bits). Peut être préféré à int pour stocker de petites valeurs entières pour économiser de l'espace.
  • texte: Représente une chaîne codée UTF-8. Devrait être utilisé quand on veut stocker des caractères non-ASCII.
  • temps: Représente une valeur temporelle. Représenté comme une chaîne dans le format 01: 02: 03.123 et stocké 64 bits signé signé qui représente nanosecondes écoulées depuis minuit.
  • horodatage: Stocke les composants date et heure avec une précision à la milliseconde. Peut être représenté sous forme de texte au format 2016-12-01 01: 02: 03.123.
  • tinyint: Représente un entier de 1 octet (8 bits). Peut être préféré à int ou smallint pour stocker de petites valeurs entières pour économiser de l'espace.
  • timeuuid: Stocke la version 1 UUID.
  • uuid: UUID au format standard. C'est une valeur plus grande par rapport à timeuuid.
  • varchar: Similaire au texte. Les deux peuvent être utilisés de façon interchangeable.
  • une variante: Une valeur entière avec une précision arbitraire. Il est conseillé d'utiliser un type de données avec la précision requise.

Types de données de collecte

  • ensemble: Ce type stocke une collection de valeurs. Les valeurs sont stockées comme non ordonnées, mais CQLSH les renverrait de manière triée. Par exemple, les chaînes seraient triées par ordre alphabétique. Modifions la table que nous avons créée ci-dessus:
> 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'

Vous pouvez utiliser les opérations de réglage habituelles comme différence enlever des éléments. Pour effacer ou remplacer le jeu complet, faites SET tags = .

  • liste: Une liste stocke également une collection de valeurs mais les stocke de manière ordonnée, par ordre d'insertion par défaut. Essayons de faire la même chose que nous avons fait ci-dessus avec des ensembles avec une liste maintenant:
> ALTER TABLE website_tracker ADD tagsListe de 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']

Dans une liste, les valeurs peuvent être ajoutées au début, soustraites (comme dans les ensembles), insérées / remplacées / supprimées par la valeur d'index (Étiquettes SET [1] = ''), etc.

  • carte: Une carte contient une collection de paires clé-valeur. Ceux-ci peuvent être n'importe quoi sauf un type de compteur. Ayons une petite description pour chaque tag.
> ALTER TABLE website_tracker ADD tagsCarte de la carte; > 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'] = 'Balise deux' ID WHERE = 1; > SELECT tagsMap FROM website_tracker WHERE id = 1; tagsMap ------------------ 'tag1': 'Tag One', 'tag2': 'Tag Two'

Types de données définis par l'utilisateur

Il est possible dans Cassandra de définir nos propres types. Cela donne beaucoup de flexibilité et facilite la maintenance globale des données. Disons que nous voulons stocker l'adresse d'enregistrement du site Web.

> Adresse CREATE TYPE (… texte de rue,… texte de ville,… texte de statut); > ALTER TABLE website_tracker ADD reg_address address;

Pour utiliser un type défini par l'utilisateur dans une collection imbriquée, nous devons le spécifier en tant que congelé collection.

> ALTER TABLE website_tracker ADD reg_addresses map>;

Utiliser GoCQL

Je suppose que vous connaissez un peu l’utilisation de Golang et la configuration et l’installation de paquetages..

Installation

Pour installer le gocql package, exécutez la commande suivante à partir de shell:

$ allez chercher github.com/gocql/gocql

Maintenant, je vais créer un script Go qui expliquera les concepts nécessaires pour comprendre gocql.

Écrire le script

main.go

package main import ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Indiquez ici l'instance de cluster cassandra. cluster: = gocql.NewCluster ("127.0.0.1") // L'authentificateur est requis si l'authentification par mot de passe est // activée pour votre installation Cassandra. Sinon, cela peut être supprimé. cluster.Authenticator = gocql.PasswordAuthenticator Nom d'utilisateur: "nom_un_utilisateur", Mot de passe: "mot_de_passe", // gocql requiert que l'espace-clé soit fourni avant la création de la session. // À l'avenir, il pourrait y avoir des dispositions pour le faire plus tard. cluster.Keyspace = "keyspace_name" // Ceci est le temps après lequel la création d'un appel de session expire. // Ceci peut être personnalisé selon les besoins. cluster.Timeout = 5 * time.Second cluster.ProtoVersion = 4 session, erreur: = cluster.CreateSession () si err! = nil log.Fatalf ("Impossible de se connecter au cluster de cassandra:% v", err) / / Vérifiez si la table existe déjà. Créer si la table n'existe pas keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name") si _, existe: = keySpaceMeta.Tables ["person"]; existe! = true // Crée une table session.Query ("CREATE TABLE person (" + ") id texte, nom texte, texte téléphone," + "PRIMARY KEY (id))"). Exec () // DIY : Mettre à jour la table avec quelque chose s'il existe déjà. // Insérer l'enregistrement dans le tableau à l'aide des instructions préparées session.Query ("INSERT INTO person (id, name, phone) VALUES (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890"). Exec ( ) // Bricolage: mettre à jour un enregistrement existant // Sélectionner un enregistrement et exécuter un processus sur les données extraites chaîne de nom var chaîne de téléphone var si err: = session.Query ("SELECT nom, téléphone de la personne WHERE"). Scan (& nom, & téléphone) ; err! = nil si err! = gocql.ErrNotFound log.Fatalf ("La requête a échoué:% v", erreur) log.Printf ("Nom:% v", nom) log.Printf ("Téléphone:% v ", phone) // Récupère plusieurs lignes et exécute le processus sur elles iter: = session.Query (" SELECT nom, phone FROM personne "). Iter () pour iter.Scan (& nom, & téléphone) log.Printf (" Nom Iter:% v ", nom) log.Printf (" Iter Phone:% v ", téléphone) // Bricolage: suppression de l'enregistrement func main () PerformOperations () 

La plupart des concepts de travail sont expliqués dans le code ci-dessus. Quelques points à noter sont les différentes opérations utilisées avec session.Query (). Outre les trois opérations ci-dessous, il en existe de nombreuses autres que vous pouvez voir dans la documentation..

  • Exec (): Cela exécuterait simplement la requête sans renvoyer de lignes. Renvoie une erreur s'il y en a.
  • Balayage(): Ceci exécuterait la requête en copiant les valeurs des colonnes de la première ligne correspondant dans la requête aux variables transmises. Il éliminerait toutes les lignes en dehors de la première.
  • Iter (): Ceci exécuterait la requête et renverrait un itérateur qui fonctionnerait alors simplement comme Balayage() fonctionne pour chaque ligne récupérée.

Lancer le script

Pour exécuter le script, exécutez la commande ci-dessous dans un shell.

$ go run main.go 2017/02/03 12:53:40 Nom: Shalabh Aggarwal 2017/02/03 12:53:40 Téléphone: 1234567890 2017/02/03 12:53:40 Iter Nom: Shalabh Aggarwal 2017 / 02/03 12:53:40 Iter Phone: 1234567890

Conclusion

Dans cette deuxième partie de cette série de didacticiels, nous avons abordé divers types de données intégrés disponibles avec Cassandra. Nous avons également vu comment fonctionnent les types de collection et comment utiliser des types définis par l'utilisateur pour rendre un schéma global flexible. Nous avons également vu comment nous pouvons interagir avec Cassandra par programmation dans Golang en utilisant gocql. Ce paquet offre beaucoup plus de fonctionnalités qui peuvent être explorées par vous-même.