Insight to action: Uppdatera data direkt från Tableau

13 januari 2019

Många gånger kommer frågan upp om man inte på något sätt kan skriva tillbaka från Tableau till en databas. Det kan t ex handla om att utifrån en analys i en dashboard markera vissa produkter, datum, regioner eller något annat som man vill flagga for att agera på i den underliggande databasen eller systemet.

Även om Tableau inte stöder detta direkt går det att åstadkomma på några olika sätt! Jag tänker i två blogginlägg beskriva hur man gör just detta på det sätt jag valde efter att själv ställts inför denna fråga och implementerat det i mina lösningar.

Mitt sätt att lösa det på var att skapa ett REST API i Python som tar emot anrop och uppdaterar en tabell i Snowflake.

Jag kommer gå igenom hur jag byggde REST API:t samt hur jag gjorde för att få Tableau att prata med det. I nästa blogginlägg kommer jag gå igenom hur jag byggde ut denna lösning med en Tableau Extension för att ge möjlighet att:
• Låta användaren mata in nya värden som skrivs till databasen.
• Via en knapp köra igång ett databasjobb för att uppdatera data i databasen.
• Automatiskt göra en reload av Tableauextraktet efter en uppdatering gjorts

Bygga REST API i Python

Detta är lättare än vad man tror så låt dig inte avskräckas bara för du inte är någon Python expert!

Låt oss titta på stommen i REST API:t

Jag använder mig av flask-RESTful för att skapa API och har skapat en Resource som heter MarkInvoice. Den har jag lagt till i API:t och i detta fall bara definierat en GET funktion. Övrig kod körs i denna GET funktion.

Jag har valt att använda mig av Snowflake som databas då det absolut är det enklaste alternativet då det är en molndatabas som går att nå från överallt. Mer om Snowflake kan du läsa här.

Det går självklart att göra detta mot vilken databas som helst, men då ser anropet lita annorlunda ut.

Att koppla sig mot Snowflake i Python är enkelt, det förutsätter att man importerat snowflake.connector i steget ovan. Här definierar jag bara användarnamn, lösenord och vilken Snowflake instans jag vill ansluta till, samt initierar en Connection:

Själva API anropet kommer se ut så här:

Och koden för att hantera det nedan, loopar den lista med dokumentnummer som kommer in och uppdaterar deras status till det som skickats in. I detta exempel till ’Handeled’:

Det är all kod som behövs för detta exempel. Man kör igång API:t på den server man vill köra det. (I detta exempel kör vi lokalt på datorn) via kommandot:

få Tableau att skicka anrop till API:t

Jag har här skapat upp ett enkelt worksheet i Tableau som visar några dokument och deras nuvarande status.

För att skapa en URL action som ropar på mitt REST API, går jag till Worksheet / Actions / Add Action > Go to URL…

Här skapar jag en action som ropar på min webservice med följande utseende:

Och döper den till ett lämpligt namn som ’Document Handled’

I det här exemplet låter jag min action visas i form av en Menu då det känns bättre än att direkt ropa på webservicen vid en Select. Om man vill kunna markera fler dokument och få dem uppdaterade så klickar man i ”Allow Multiple Values”

Nu är det bara att testa. Markera den rad du vill uppdatera och högerklicka på den. Din URL action syns då som ett menyval och om du väljer den går ett anrop iväg till det REST API vi körde igång tidigare och uppdaterar i databasen. I detta fall uppdateras Document Number 1235 till status ’Handeled’

Du måste tyvärr tvinga fram en egen refresh av Tableau efter att du har gjort detta, men det kommer jag i nästa blogginlägg visa på hur man gör via en extension.

Success! Datakällan har nu uppdaterats och du ser det nedan i Tableau:

Svårare än så är det inte! Nu är detta självklart ett enkelt exempel för att tydligt visa på tekniken. Koden går att förfina en hel del samt om man vill använda detta i en produktionssituation krävs som vanligt att man lägger lite mer kärlek på lösningen. Nedan några länkar som jag använt mig av som förklarar mer om hur man bygger API och flask-RESTful

https://codeburst.io/
https://flask-restful.readthedocs.io

Har du några andra frågor så tveka inte att kontakta mig eller någon av mina kollegor på Sparks så hjälper vi dig.