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.
waar
of vals
.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)
yyyy-mm-dd
.01: 02: 03,123
en opgeslagen 64-bits geheel getal met teken dat overeenkomt met nanoseconden die zijn verstreken sinds middernacht.2016-12-01 01: 02: 03.123
.> 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 =
.
> 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.
> 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'
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>;
Ik ga ervan uit dat je enige kennis hebt over het gebruik van Golang en het configureren en installeren van pakketten.
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
.
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.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
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.