The Information Lab

Verbinding maken met Snowflake vanuit een Python-script met Single-Sign On

Geschreven door Mario van der Velden | Sep 23, 2022 9:00:00 AM

Eenmalig aanmelden met Snowflake Python Connector

Python speelt een belangrijke rol in de infrastructuur van Snowflake: Snowflake's opdrachtregelclient SnowSQL is gebouwd met behulp van de Snowflake Connector voor Python. Je kunt zelfs Python-code schrijven in Snowflake SQL met behulp van Python UDF's, wat echt een coole functie is. Bekijk deze blog van Atzmon Ben Binyamin als je daar meer over wilt weten.

Het is dus niet verrassend dat het mogelijk is om rechtstreeks verbinding te maken met Snowflake vanuit een Python-script. Meestal kan dit in slechts een paar stappen. In deze blog bekijken we 2 manieren om deze verbinding tot stand te brengen: eerst bekijken we hoe je verbinding maakt met een gebruikersnaam en wachtwoord en daarna bekijken we hoe je verbinding maakt met Single Sign-On (SSO), bijvoorbeeld van Google. Met SSO kun je inloggen in Snowflake met je referenties van een andere partij (zoals Google). Dit kan enkele beveiligingsvoordelen hebben. Het kan ook de manier zijn waarop de Snowflake-verbinding in jouw organisatie is ingesteld (zoals soms in de onze).

De Snowflake-connector installeren

Python-scripts kunnen verbinding maken met Snowflake via de Snowflake Connector for Python. Dit is een module die rechtstreeks in je script kan worden geïmporteerd met de volgende regel:

import snowflake.connector

Om dit te laten werken, moet de connector al geïnstalleerd zijn. Hij is niet opgenomen in de standaardbibliotheek. Installatie is eenvoudig met pip (de pakketbeheerder van Python). Als pip niet werkt op je systeem, kun je beter ensurepip gebruiken. Als je dat hebt, voer dan de volgende regel in de commandoregel in (bijvoorbeeld de Terminal op macOS) en druk op Enter / Return.

python -m pip installeer snowflake-connector-python

Verbinding maken met gebruikersnaam en wachtwoord

De verbinding kan tot stand worden gebracht via de connect-functie(snowflake.connector.connect). Deze functie accepteert een aantal argumenten, maar in dit geval heb je in ieder geval account, gebruiker en wachtwoord nodig. Voor de rest van deze blog ga ik ervan uit dat je de volgende variabelen in je script hebt ingesteld. Vul de waarden achter de = in zodat jouw situatie wordt weergegeven. Wat je moet invullen als je Snowflake Account Identifier kan variëren. Probeer verschillende opties als het niet werkt. Soms hebt u alleen uw Account Locator nodig en soms hebt u uw Account Locator, Cloud Region ID en Cloud nodig. Bekijk de vorige link voor meer informatie.

YOUR_ACCOUNT = <uw Snowflake Account Identifier>YOUR_USER = <uw gebruikersnaam voor de Snowflake Account>YOUR_PASS = <uw wachtwoord voor de gebruikersnaam>.

Nu we de juiste variabelen hebben ingesteld, kunnen we ze doorgeven aan de connect-functie. We kunnen ze rechtstreeks aan de functie doorgeven:

snowflake.connector.connect( account=JOUW_ACCOUNT , gebruiker=JOUW_GEBRUIKER , wachtwoord=JOUW_PAS )

Maar we kunnen de referenties ook in een woordenboek zetten en de functie aanroepen met een woordenboek voorafgegaan door **. Persoonlijk geef ik de voorkeur aan die methode. Zie Python Woordenlijst: Argument voor meer informatie. In wezen worden de woordenboekitems uitgepakt tot trefwoordargumenten.

credentials = { 'account' : YOUR_ACCOUNT , 'user' : YOUR_USER , 'password' : YOUR_PASS } snowflake.connector.connect(**credentials)

Een query doorgeven

Deze scripts doen nog niets. Laten we een eenvoudige query doorgeven aan de verbinding. In dit voorbeeld vragen we Snowflake wie de huidige gebruiker is. Snowflake voldoet aan PEP 249 (zie de Snowflake docs). Dat betekent dat we de standaard python database-interactie kunnen gebruiken(cursor, fetchall, close etc.), en we kunnen ook een with statement gebruiken!

import snowflake.connector credentials = { 'account' : YOUR_ACCOUNT , 'user' : YOUR_USER , 'password' : YOUR_PASS } cnx = snowflake.connector.connect(**credentials) # maak een cursor die queries kan uitvoeren cur = cnx.cursor() # voer een regel SQL uit cur.execute('SELECT CURRENT_USER()') # haal de informatie uit de cursor text = cur.fetchall() print(text) cnx.close()

Als alternatief kunnen we een with statement gebruiken zodat we de verbinding niet achteraf hoeven te sluiten. Python doet dat voor ons!

import snowflake.connector credentials = { 'account' : YOUR_ACCOUNT , 'user' : YOUR_USER , 'password' : YOUR_PASS } with snowflake.connector.connect(**credentials) as cnx: cur = cnx.cursor() cur.execute('SELECT CURRENT_USER()') text = cur.fetchall() print(text)

Single-Sign On gebruiken

We hebben het meeste werk gedaan! We hebben alleen een kleine aanpassing nodig om de verbinding ook met SSO te laten werken. Soms is het beter om in te loggen via de browser en dit kan nodig zijn in jouw situatie. Als we willen dat Python een browservenster opent en u zich bij Snowflake laat identificeren via uw Identity Provider (IdP), verandert u 'password' in 'authenticator' in het credentials woordenboek en stelt u de waarde in op 'externalbrowser'. De rest van het script blijft hetzelfde.

import snowflake.connector credentials = { 'account' : YOUR_ACCOUNT , 'user' : YOUR_USER , 'authenticator' : 'externalbrowser' } with snowflake.connector.connect(**credentials) as cnx: cur = cnx.cursor() cur.execute('SELECT CURRENT_USER()') text = cur.fetchall() print(text)

Nadat je hebt ingelogd via je IdP, zou je het volgende scherm moeten zien en je script zou al de resultaten kunnen hebben opgeleverd waar je naar op zoek was. Houd er rekening mee dat je je in dit scenario elke keer dat je het script uitvoert moet identificeren via de browser! Dat kan een beetje vervelend zijn.

Conclusie

We hebben gekeken naar het verbinden van Python met Snowflake via de Snowflake Connector voor Python. We gebruikten zowel een verbinding die een wachtwoord gebruikt als een verbinding die authenticatie via de browser (met SSO) gebruikt. Ik hoop dat je deze blog nuttig vond. Bezoek zeker onze site The Information Lab NL voor meer blogposts, trainingen en consultancy diensten met betrekking tot Tableau, Alteryx en Snowflake.