Aan de slag met Cassandra CQL-gegevenstypen en gebruik van GoCQL

In het eerste deel van deze tutorialserie behandelde ik de basisprincipes van Cassandra en gebruikte ik CQLSH om via shell met het databasesysteem te communiceren. In dit tweede deel zal ik kort ingaan op de belangrijkste datatypes die beschikbaar zijn in CQL. Dan zal ik de essentie van gocql, een Golang-clientpakket dat de Cassandra-driver voor Golang implementeert. Ik zal bespreken hoe je een sessieverbinding met Cassandra maakt met enkele configuratie-opties en vervolgens hoe je verschillende query's uitvoert met behulp van de sessie.

Cassandra biedt ondersteuning voor basisdatatypes die beschikbaar zijn in bijna alle databasesystemen. Afgezien hiervan biedt het ook complexe verzamelingen die combinaties van eenvoudige gegevens kunnen opslaan in de vorm van lijst, set en kaart. Afgezien hiervan heeft CQL ook ondersteuning voor door de gebruiker gedefinieerde typen, waardoor ontwikkelaars hun eigen datatypes kunnen hebben die gemakkelijk te lezen en te begrijpen zijn.

Basis gegevenstypen

  • ascii: Vertegenwoordigt een reeks ASCII-tekens. Het invoegen van een niet-ASCII-teken in een kolom van dit type zou een fout tot gevolg hebben.
  • bigint: Vertegenwoordigt een 64-bits lange handtekening. Gebruikt om lange nummers op te slaan. Dit moet alleen worden gebruikt als we zeker weten dat we zulke lange getallen nodig hebben, omdat dit meer ruimte inneemt ten opzichte van int.
  • blob: Gebruikt om willekeurige bytes op te slaan. Dit wordt weergegeven als hexadecimaal en alle gegevens zonder enige validatie kunnen in dit veld worden opgeslagen.
  • boolean: winkel waar of vals.
  • teller: Vertegenwoordigt een 64-bits geheel getal met teken, maar de waarde van deze kolom kan niet worden ingesteld. Er zijn slechts twee bewerkingen in deze kolom, oplopend en aflopend. In een tabel met een tellerkolom zijn alleen de soorten en primaire sleutel toegestaan. Er zijn geen INSERT afschriften toegestaan ​​in een tabel met tegenkolom (len); enkel en alleen BIJWERKEN kan worden gebruikt. Bijvoorbeeld:
> CREATE TABLE website_tracker (id int PRIMARY KEY, url-tekst, visitor_count-teller); > UPDATE website_tracker SET visitor_count = visitor_count + 1 WHERE id = 1; > SELECT * FROM website_tracker; id | url tel ---- + ------ + ------ 1 | a.com | 1 (1 rijen)
  • datum: Vertegenwoordigt een datumwaarde zonder een tijdwaarde. Cassandra codeert hetzelfde als een geheel getal sinds epoch. Datums kunnen in reeksen worden weergegeven als strings yyyy-mm-dd.
  • decimale: Vertegenwoordigt een decimale waarde met variabele precisie. Beste voor het opslaan van valuta of financiële waarden.
  • dubbele: Slaat een 64-bits drijvende-kommawaarde op.
  • vlotter: Slaat een 32-bits drijvende-kommawaarde op.
  • inet: Vertegenwoordigt een IP-adresstring in IPv4- of IPv6-indeling.
  • int: Vertegenwoordigt een 32-bits geheel getal met teken. Meestal gebruikt bij het opslaan van integer-waarden.
  • smallint: Vertegenwoordigt een 2-byte (16-bits) geheel getal. Kan de voorkeur hebben boven int voor het opslaan van kleine gehele waarden om ruimte te besparen.
  • tekst: Vertegenwoordigt een UTF-8-gecodeerde reeks. Moet worden gebruikt wanneer we niet-ASCII-tekens willen opslaan.
  • tijd: Vertegenwoordigt een tijdswaarde. Vertegenwoordigd als een tekenreeks in het formaat 01: 02: 03,123 en opgeslagen 64-bits geheel getal met teken dat overeenkomt met nanoseconden die zijn verstreken sinds middernacht.
  • timestamp: Slaat zowel datum- als tijdcomponenten op met milliseconde precisie. Kan worden weergegeven als tekst in het formaat 2016-12-01 01: 02: 03.123.
  • tinyint: Vertegenwoordigt een 1-byte (8-bit) geheel getal. Kan de voorkeur hebben boven int of smallint voor het opslaan van kleine gehele waarden om ruimte te besparen.
  • timeuuid: Slaat versie 1 UUID op.
  • uuid: UUID in standaardformaat. Dit is een grotere waarde in vergelijking met tijd.
  • varchar: Gelijk aan tekst. Beide kunnen door elkaar worden gebruikt.
  • variant: Een geheel getal met willekeurige nauwkeurigheid. Het wordt geadviseerd om een ​​datatype met de vereiste precisie te gebruiken.

Typen verzamelingsgegevens

  • te stellen: Dit type slaat een verzameling waarden op. De waarden worden opgeslagen als ongeordend, maar CQLSH zou ze op een gesorteerde manier retourneren. De tekenreeksen worden bijvoorbeeld alfabetisch gesorteerd. Laten we de bovenstaande tabel aanpassen:
> ALTER TABLE website_tracker ADD tagsSetset; > 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'

U kunt de gebruikelijke ingestelde bewerkingen gebruiken zoals verschil om elementen te verwijderen. Om de volledige set te verwijderen of te vervangen, doe SET-tags = .

  • lijst: In een lijst wordt ook een verzameling waarden opgeslagen, maar deze worden op een geordende manier opgeslagen, standaard in de volgorde van invoegen. Laten we hetzelfde proberen te doen als hierboven met sets met een lijst nu:
> ALTER TABLE website_tracker ADD labelsLijstlijst; > 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 een lijst kunnen waarden worden voorafgegaan, afgetrokken (zoals in sets), ingevoegd / vervangen / verwijderd door indexwaarde (SET-tags [1] = ''), enz.

  • kaart: Een kaart bevat een verzameling sleutel / waarde-paren. Deze kunnen van alles zijn, behalve een tellertype. Laten we een korte beschrijving geven voor elke tag.
> ALTER TABLE website_tracker ADD-tagsMapkaart; > 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 twee' WHERE id = 1; > SELECT tagsMap FROM website_tracker WHERE id = 1; tagsMap ------------------ 'tag1': 'Tag One', 'tag2': 'Tag Two'

Door de gebruiker gedefinieerde gegevenstypen

Het is mogelijk in Cassandra om onze eigen types te definiëren. Dit geeft veel flexibiliteit en maakt algehele onderhoud van gegevens eenvoudiger. Laten we zeggen dat we het registratieadres van de website willen opslaan.

> CREATE TYPE-adres (... straattekst, ... stadstekst, ... staatstekst); > ALTER TABLE website_tracker ADD reg_adres adres;

Als u een door de gebruiker gedefinieerd type in een geneste verzameling wilt gebruiken, moeten we dit specificeren als een bevroren verzameling.

> ALTER TABLE website_tracker ADD reg_addresses map>;

GoCQL gebruiken

Ik ga ervan uit dat je enige kennis hebt over het gebruik van Golang en het configureren en installeren van pakketten.

Installatie

Om de te installeren gocql pakket, voer de volgende opdracht uit vanuit de shell:

$ ga naar github.com/gocql/gocql

Nu zal ik een Go-script maken dat de concepten uitlegt die nodig zijn om te begrijpen gocql.

Het script schrijven

main.go

pakket main import ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Geef hier de instantie cassandra cluster. cluster: = gocql.NewCluster ("127.0.0.1") // De authenticator is nodig als wachtwoordverificatie // is ingeschakeld voor uw Cassandra-installatie. Zo niet, dan kan dit // worden verwijderd. cluster.Authenticator = gocql.PasswordAuthenticator Gebruikersnaam: "some_username", Wachtwoord: "some_password", // gocql vereist de sleutelruimte die moet worden opgegeven voordat de sessie wordt gemaakt. // In de toekomst kunnen er bepalingen zijn om dit later te doen. cluster.Keyspace = "keyspace_name" // Dit is de tijd waarna het maken van een sessie-aanroep zou verlopen. // Dit kan naar behoefte worden aangepast. cluster.Timeout = 5 * time.Second cluster.ProtoVersion = 4 sessie, err: = cluster.CreateSession () if err! = nil log.Fatalf ("Kon geen verbinding maken met cassandra cluster:% v", err) / / Controleer of de tabel al bestaat. Maken als tabel niet bestaat keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name") als _, exists: = keySpaceMeta.Tables ["person"]; exists! = true // Maak een tafelsessie.Query ("CREATE TABLE-persoon (" + "id-tekst, naamtekst, telefoontekst," + "PRIMARY KEY (id))"). Exec () // DIY : Tabel bijwerken met iets als het al bestaat. // Voeg een record in de tabel in met de voorbereide instructiesessie. Vraag ("INSERT INTO persoon (id, naam, telefoon) WAARDEN (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890"). Exec ( ) // DIY: bestaande record bijwerken // Selecteer record en voer een proces uit op gegevens opgehaald var naam tekenreeks var telefoonreeks if err: = session.Query ("naam kiezen, telefoon van persoon WHERE"). Scan (& naam, & telefoon) ; err! = nil if err! = gocql.ErrNotFound log.Fatalf ("Zoekopdracht mislukt:% v", err) log.Printf ("Naam:% v", naam) log.Printf ("Telefoon:% v ", telefoon) // Haal meerdere rijen op en voer het proces over hen uit iter: = session.Query (" SELECT-naam, telefoon VAN persoon "). Iter () voor iter.Scan (& naam, & telefoon) log.Printf (" Iter Naam:% v ", naam) log.Printf (" Iter Telefoon:% v ", telefoon) // DIY: Record verwijderen func main () PerformOperations () 

De meeste werkconcepten worden uitgelegd in de bovenstaande code zelf. Een aantal opvallende punten zijn de verschillende bewerkingen die tegelijkertijd worden gebruikt session.Query (). Afgezien van de drie onderstaande handelingen worden er veel meer ondersteund die in de documentatie te zien zijn.

  • Exec (): Dit zou gewoon de query uitvoeren zonder rijen te retourneren. Geeft als resultaat een fout.
  • Scannen(): Hiermee wordt de query uitgevoerd terwijl de waarden van kolommen uit de eerste rij in de query worden gekopieerd naar de doorgegeven variabelen. Het zou rijen weggooien behalve de eerste.
  • Iter (): Dit zou de query uitvoeren en een iterator retourneren die dan gewoon zou werken zoals hoe Scannen() werkt voor elke opgehaalde rij.

Het script uitvoeren

Voer de onderstaande opdracht in shell uit om het script uit te voeren.

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

Conclusie

In dit tweede deel van deze tutorialserie hebben we verschillende ingebouwde gegevenstypen behandeld die beschikbaar zijn met Cassandra. We hebben ook gezien hoe collectietypen werken en hoe door de gebruiker gedefinieerde typen kunnen worden gebruikt om een ​​algeheel schema flexibel te maken. We hebben ook gezien hoe we met behulp van gocql programmatisch kunnen communiceren met Cassandra in Golang. Dit pakket biedt veel meer functionaliteit die alleen kan worden verkend.