Komme i gang med Cassandra CQL datatyper og bruk av GoCQL

I den første delen av denne opplæringsserien dekket jeg veldig grunnleggende om Cassandra og brukte CQLSH til å kommunisere med databasesystemet via shell. I denne andre delen vil jeg kortfattet dekke de store datatyper som er tilgjengelige i CQL. Da skal jeg dekke hovedtrekkene til gocql, en Golang klientpakke som implementerer Cassandra-driveren for Golang. Jeg vil dekke hvordan du lager en øktforbindelse med Cassandra med noen konfigurasjonsalternativer og deretter hvordan du kjører ulike søk ved hjelp av økten.

Cassandra støtter grunnleggende datatyper som er tilgjengelige i nesten alle databasesystemer. Bortsett fra dette gir det også komplekse samlingstyper som kan lagre kombinasjoner av enkle data i form av liste, sett og kart. Bortsett fra dette har CQL også støtte for brukerdefinerte typer, slik at utviklere har egne datatyper som er lette å lese og forstå.

Grunnleggende datatyper

  • ascii: Representerer en streng av ASCII-tegn. Innsetting av et ikke-ASCII-tegn i en kolonne av denne typen vil føre til en feil.
  • bigint: Representerer en 64-bit signert lang. Brukes til å lagre lange tall. Dette bør bare brukes når vi er sikre på at vi trenger så lange tall fordi dette innehar mer plass i forhold til int.
  • blob: Brukes til å lagre vilkårlig byte. Dette er representert som heksadesimale, og alle data uten validering kan lagres i dette feltet.
  • boolean: butikker ekte eller falsk.
  • disk: Representerer et 64-biters signert heltall, men verdien av denne kolonnen kan ikke settes. Det er bare to operasjoner i denne kolonnen, økning og reduksjon. I et bord med en tellerkolonne er det bare tellertyper og primærnøkkel tillatt. Det er nei SETT INN uttalelser tillatt i et bord med counter kolonne (r); bare OPPDATER kan bli brukt. For eksempel:
> CREATE TABLE website_tracker (id int PRIMARY KEY, url tekst, visitor_count counter); > OPPDATERING website_tracker SET visitor_count = visitor_count + 1 hvor id = 1; > VELG * FRA website_tracker; id | url | telle ---- + ------ + ------ 1 | a.com | 1 (1 rader)
  • Dato: Representerer en dataværdi uten en tidsverdi. Cassandra koder det samme som et heltall siden epoken. Datoer kan representeres som strenge i format yyyy-mm-dd.
  • desimal: Representerer en desimalverdier med variabel presisjon. Best for å lagre valuta eller finansielle verdier.
  • dobbelt: Lagrer en 64-biters flytende punktverdi.
  • flyte: Lagrer en 32-biters flytpunktsverdi.
  • inet: Representerer en IP-adresse streng i IPv4 eller IPv6 format.
  • int: Representerer et 32-biters signert heltall. Brukes mest når du lagrer heltallverdier.
  • smallint: Representerer et 2-byte (16-biters) heltall. Kan foretrekkes over int for lagring av små heltallverdier for å spare plass.
  • tekst: Representerer en UTF-8 kodet streng. Skal brukes når vi vil lagre ikke-ASCII-tegn.
  • tid: Representerer en tidsverdi. Representert som en streng i formatet 01: 02: 03,123 og lagret 64-bits signert heltall som representerer nanosekunder som er gått siden midnatt.
  • tidsstempel: Lagrer både dato og tid komponenter med millisekunder presisjon. Kan representeres som tekst i formatet 2016-12-01 01: 02: 03.123.
  • tinyint: Representerer et 1-byte (8-biters) heltall. Kan foretrekkes over int eller smallint for lagring av små heltallverdier for å spare plass.
  • timeuuid: Lagrer versjon 1 UUID.
  • UUID: UUID i standardformat. Dette er en større verdi i forhold til timeuuid.
  • varchar: Ligner på tekst. Begge kan brukes om hverandre.
  • variant: En heltall verdi med vilkårlig presisjon. Det anbefales at du bruker en datatype med nødvendig presisjon.

Samling Datatyper

  • sett: Denne typen lagrer en samling verdier. Verdiene lagres som uordnet, men CQLSH vil returnere dem på en sortert måte. For eksempel vil strenger sorteres alfabetisk. La oss endre tabellen vi opprettet over:
> ALTER TABLE website_tracker ADD tagsSet sett; > OPPDATERING website_tracker SET tagsSet = 'tag1' HVOR id = 1; > SELECT tagsSet FROM website_tracker hvor id = 1; tagsSet ---------- 'tag1'> UPDATE website_tracker SET tagsSet = tagsSet + 'gat2' HVOR id = 1; > SELECT tagsSet FROM website_tracker hvor id = 1; tagsSet ------------------ 'gat2', 'tag1'

Du kan bruke de vanlige angitte operasjonene som forskjell for å fjerne elementer. For å fjerne eller erstatte hele settet, gjør du SET-koder = .

  • liste: En liste lagrer også en samling verdier, men lagrer dem på ordnet måte, som er i rekkefølgen for innsetting som standard. La oss prøve å gjøre det samme som vi gjorde over med sett med en liste nå:
> ALTER TABLE website_tracker ADD tagsList liste; > OPPDATERING website_tracker SET tagsList = ['tag1'] HVOR id = 1; > SELECT tagsList FROM website_tracker hvor id = 1; tagsList ---------- ['tag1']> UPDATE website_tracker SET tagsList = tagsList + ['gat2'] WHERE id = 1; > SELECT tagsList FROM website_tracker hvor id = 1; tagsList ------------------ ['tag1', 'gat2']

I en liste kan verdier bli prepended, subtraheres (som i sett), satt inn / erstattet / slettet av indeksverdien (SET-koder [1] = ''), etc.

  • kart: Et kart inneholder en samling av nøkkelverdige par. Disse kan være alt unntatt en tellertype. La oss få en liten beskrivelse for hver tag.
> ALTER TABLE website_tracker ADD tagsMap map; > UPDATE website_tracker SET tagsMap = 'tag1': 'Tag ett' HVOR id = 1; > SELECT tagsMap FROM website_tracker HVOR id = 1; tagsMap ---------------------- 'tag1': 'Tag ett'> UPDATE website_tracker SET tagsMap ['tag2'] = 'Merk to' hvor ID = 1; > SELECT tagsMap FROM website_tracker HVOR id = 1; tagsMap ------------------ 'tag1': 'Tag ett', 'tag2': 'Merk to'

Brukerdefinerte datatyper

Det er mulig i Cassandra å definere våre egne typer. Dette gir stor fleksibilitet og gjør det enklere å vedlikeholde dataene. La oss si at vi ønsker å lagre registreringsadressen til nettstedet.

> CREATE TYPE adresse (... gate tekst, ... by tekst, ... statlig tekst); > ALTER TABLE website_tracker ADD reg_address adresse;

For å kunne bruke en brukerdefinert type i en nestet samling, må vi spesifisere den som en frossen samling.

> ALTER TABLE website_tracker ADD reg_addresses kart>;

Bruke GoCQL

Jeg antar at du har kunnskap om å bruke Golang og konfigurere og installere pakker.

Installasjon

For å installere gocql pakke, kjør følgende kommando fra skallet:

$ gå github.com/gocql/gocql

Nå skal jeg lage et Go-skript som vil forklare konseptene som trengs for å forstå gocql.

Skrive skriptet

main.go

pakke viktigste import ("github.com/gocql/gocql" "log" "time") func PerformOperations () // Gi cassandra cluster instance her. cluster: = gocql.NewCluster ("127.0.0.1") // Autentiseringen er nødvendig hvis passordautentisering er // aktivert for Cassandra-installasjonen. Hvis ikke, kan dette / / fjernes. cluster.Authenticator = gocql.PasswordAuthenticator Brukernavn: "some_username", Passord: "some_password", // gocql krever nøkkelplassen som skal oppgis før sesjonen opprettes. // I fremtiden kan det være bestemmelser for å gjøre dette senere. cluster.Keyspace = "keyspace_name" // Dette er tiden etter som opprettelsen av øktsamtalen ville timeout. // Dette kan tilpasses etter behov. cluster.Timeout = 5 * time.Second cluster.ProtoVersion = 4 økt, feil: = cluster.CreateSession () hvis err! = null log.Fatalf ("Kunne ikke koble til cassandra cluster:% v", err) / / Sjekk om tabellen allerede eksisterer. Opprett hvis tabellen ikke eksisterer keySpaceMeta, _: = session.KeyspaceMetadata ("keyspace_name") hvis _, eksisterer: = keySpaceMeta.Tables ["person"]; eksisterer! = true // Opprett en tabell session.Query ("CREATE TABLE person (" + "id tekst, navn tekst, telefon tekst," + "PRIMARY KEY (id))). Exec () // DIY : Oppdater tabell med noe hvis det allerede eksisterer. // Sett inn post i tabell ved hjelp av forberedte setninger session.Query ("INSERT INTO person (ID, navn, telefon) VALUES (?,?,?)", "Shalabh", "Shalabh Aggarwal", "1234567890"). ) // DIY: Oppdater eksisterende post // Velg post og kjør litt prosess på data hentet var navnstreng var telefonstreng hvis feil: = session.Query ("VELG navn, telefon FRA person WHERE"). Skann (& navn og telefon) ; err! = null hvis feil! = gocql.ErrNotFound log.Fatalf ("Forespørsel mislyktes:% v", err) log.Printf ("Navn:% v", navn) log.Printf ("Telefon:% v ", telefon) // Hent flere rader og kjør prosess over dem iter: = session.Query (" VELG navn, telefon FRA person ") .Iter () for iter.Scan (& navn og telefon) log.Printf Iter Navn:% v ", navn) log.Printf (" Iter Telefon:% v ", telefon) // DIY: Slett post Func Main () PerformOperations () 

De fleste arbeidskonseptene er forklart i selve koden selv. Noen poeng verdt å merke seg er de forskjellige operasjonene som brukes sammen med session.Query (). Bortsett fra de tre operasjonene nedenfor, er det mange flere støttede som kan ses i dokumentasjonen.

  • Exec (): Dette ville bare utføre spørringen uten å returnere noen rader. Returnerer feil hvis noen.
  • Scan (): Dette ville utføre spørringen mens du kopierer verdiene av kolonner fra den første raden som er matchet i spørringen til variablene som er gått. Det ville kaste bort noen rader bortsett fra den første.
  • Iter (): Dette ville utføre spørringen og returnere en iterator som da bare ville fungere som hvordan Scan () Fungerer for hver rad hentet.

Kjører skriptet

For å kjøre skriptet, kjør kommandoen nedenfor i skallet.

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

Konklusjon

I denne andre delen av denne opplæringsserien dekket vi ulike innebygde datatyper tilgjengelig med Cassandra. Vi så også hvordan samlingstyper fungerer og hvordan brukerdefinerte typer kan brukes til å gjøre et overordnet skjema fleksibelt. Vi så også hvordan vi kan samhandle med Cassandra programmatisk i Golang ved hjelp av gocql. Denne pakken tilbyr mye mer funksjonalitet som kan utforskes alene.