Préparation d’un dossier local avec des artefacts Snowflake Native App configurés¶
Créer un dossier local avec des artefacts configurés¶
La commande snow app bundle
crée un répertoire local dans votre projet, le remplit avec la structure de fichiers que vous avez spécifiée dans le fichier de définition du projet et génère des déclarations CREATE FUNCTION ou CREATE PROCEDURE dans les scripts d’installation de Snowflake Native App à partir du code Snowpark Python qui inclut des décorateurs (tels que @sproc
ou @udaf
). Pour plus d’informations, consultez la documentation Python Snowpark correspondant au décorateur de fonction choisi, tel que snowflake.snowpark.functions.udaf.
Les commandes snow app deploy
et snow app run
utilisent déjà cette fonctionnalité. Cependant, maintenant avec une commande snow app bundle
explicite à votre disposition, vous pouvez explorer ce répertoire avant qu’il ne soit téléchargé dans la zone de préparation, pour vérifier que les artefacts ont été créés comme prévu.
Pour créer un dossier local avec les artefacts configurés, procédez comme suit :
Créez ou vérifiez votre fichier de définition de projet
snowflake.yml
Snowflake, tel que :definition_version: 2 entities: codegen_nativeapp_pkg: type: application package manifest: root_files/_manifest.yml artifacts: - src: root_files/README.md dest: README.md - src: root_files/_manifest.yml dest: manifest.yml - src: root_files/setup_scripts/* dest: setup_scripts/ - src: python/user_gen/echo.py dest: user_gen/echo.py - src: python/cli_gen/* dest: cli_gen/ processors: - snowpark codegen_nativeapp_pkg: type: application from: target: codegen_nativeapp_pkg
Depuis votre répertoire de projet, exécutez la commande
snow app bundle
pour créer le répertoire temporaireoutput/deploy
qui contient vos artefacts configurés.snow app bundle
Vérifiez que le contenu du répertoire de sortie ou de déploiement correspond aux règles que vous avez spécifiées dans le fichier snowflake.yml. Si vous avez appelé le traitement des annotations Snowpark dans vos fichiers Python, vous pouvez voir le code généré dans le script d’installation modifié dans le répertoire.
Pour plus d’informations, consultez la commande snow app bundle.
Générer du code SQL en utilisant le traitement des annotations Snowpark¶
En tant que développeur de Snowflake Native App avec des notions limitées en SQL, vous pourriez trouver cela fastidieux d’écrire et de maintenir des scripts d’installation, qui peuvent devenir assez volumineux et compliqués au fil du temps. Les scripts d’installation contiennent toute la logique d’application qu’un client peut utiliser avec ses données et constituent donc une partie obligatoire du développement d’une Snowflake Native App. L’un des composants principaux des scripts d’installation est votre capacité à utiliser les fonctions d’extension Snowpark Python pour les fonctions et les procédures stockées. En plus d’écrire du code Snowpark en Python, Java ou d’autres langages pris en charge par Snowpark, vous devez écrire les parties correspondantes de ces fonctions et procédures en utilisant SQL dans le script d’installation.
Par exemple, vous pouvez créer une fonction de base et une procédure stockée à l’aide de Snowpark Python, comme indiqué :
# Example python file "echo.py" that a developer writes
def echo_fn(data):
return 'echo_fn: ' + data
def echo_proc(session, data):
return 'echo_proc: ' + data
Vous devrez ensuite télécharger le fichier dans une zone de préparation et vous y référer à partir du code SQL du script d’installation, semblable au suivant :
-- Sample setup_script.sql SQL file for a Snowflake Native App
CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_proc'
IMPORTS=('/echo.py');
GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
TO APPLICATION ROLE app_instance_role;
-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
TO APPLICATION ROLE app_instance_role;
Génération automatique de code SQL¶
Note
Pour profiter de la génération automatique de code SQL, vous devez utiliser Snowpark Python version 1.15.0 et supérieure.
Pour aider à alléger ce travail supplémentaire, Snowflake CLI peut générer automatiquement le code SQL nécessaire pour vos scripts d’installation. Snowpark Python prend en charge une fonctionnalité appelée « décorateurs de fonctions d’extension » (@udf
, @sproc
, @udtf
, et @udaf
) qui vous permet d’annoter votre code Python, par exemple en utilisant le décorateur de fonction snowflake.snowpark.functions.udf. Snowflake CLI peut utiliser ces décorateurs pour créer et valider automatiquement le code SQL nécessaire pour vos scripts d’installation.
Par exemple, vous pouvez utiliser le décorateur @udf
pour la fonction de l’exemple précédent :
# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
return 'echo_fn: ' + str
L’utilisation du décorateur @udf
indique à Snowflake CLI snow app bundle (et d’autres commandes qui appellent en interne la commande snow app bundle
) de traiter les décorateurs Python Snowpark, de générer les commandes SQL correspondantes et de les inclure automatiquement dans le script d’installation, comme indiqué. Vous pouvez donc réduire la quantité de code SQL que vous devez écrire pour votre script d’installation.
-- Sample setup_script.sql SQL file for a Snowflake Native App
-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
TO APPLICATION ROLE app_instance_role;
Utilisation de décorateurs Snowpark Python¶
Pendant que les décorateurs Snowpark dans Snowflake CLI fonctionnent de la même manière que les décorateurs Python Snowpark classiques, vous devez être conscient des différences suivantes lors de l’écriture de fichiers de code Python spécifiquement pour une Snowflake Native App :
Vous ne pouvez pas utiliser d’objets
Session
dans ces fichiers, comme Snowflake CLI exécute ces fichiers Python dans un environnement sandbox sans connexion à Snowflake. En conséquence, toute référence à un objet SnowparkSession
entraîne une erreur.Vous ne pouvez utiliser que les décorateurs
@udf
,@sproc
,@udaf
et@udtf
Snowpark Python.Vous ne pouvez pas utiliser ces décorateurs comme fonctions normales pour enregistrer votre code en tant qu’objet Snowflake. Seul le code explicitement annoté avec les décorateurs pris en charge est reconnu. Par conséquent, la fonction Python doit être une fonction nommée. Les fonctions Lambda ne sont pas prises en charge.
Snowflake CLI génère toujours des instructions CREATE OR REPLACE, comme recommandé par Snowflake, pour créer des fonctions et des procédures dans vos scripts d’installation.
En savoir plus sur les propriétés des décorateurs¶
Le tableau suivant répertorie les propriétés de décorateurs Python et explique comment Snowflake CLI les utilise.
Propriété |
Détails |
---|---|
name Facultatif |
Nom de la fonction ou de la procédure stockée que Snowflake CLI utilise pour générer les instructions SQL. Si vous omettez cette propriété, Snowflake CLI réutilise le nom de la fonction Python pour générer les instructions SQL. |
input_types Requis |
Types pour chaque paramètre d’entrée pour cette fonction ou procédure stockée. Vous devez fournir ces informations soit dans ce paramètre de décorateur, soit fournir des annotations de type directement dans votre code. Si ces informations ne sont disponibles dans aucun des deux endroits, Snowflake CLI ne génère pas d’instructions SQL pour cette fonction ou procédure stockée. |
return_type Requis |
Type de la valeur de retour pour cette fonction ou procédure stockée. Vous devez fournir ces informations soit dans ce paramètre de décorateur, soit fournir une annotation de type directement dans votre code. Si ces informations ne sont disponibles dans aucun des deux endroits, Snowflake CLI ne génère pas d’instructions SQL pour cette fonction ou procédure stockée. |
packages Facultatif |
Liste des paquets. Vous pouvez spécifier Si vous omettez cette propriété, Snowflake CLI ajoute automatiquement |
imports Facultatif |
Liste des fichiers que votre fonction Snowflake ou procédure stockée doit importer à partir de la zone de préparation. Vous pouvez les spécifier soit sous forme de chaîne, soit sous forme de tuple de chaînes. Si vous spécifiez un tuple, Snowflake CLI utilise uniquement la chaîne à l’index 0. Pour un exemple d’utilisation d’un tuple, voir Utiliser des fichiers Python externes. Si vous ne spécifiez aucune importation, Snowflake CLI ajoute automatiquement une importation pour le fichier Python qui contient la fonction ou la procédure stockée pour laquelle il génère le code SQL. Le chemin de l’importation est déterminé par le paramètre |
execute_as Facultatif |
Persona à utiliser lors de l’exécution d’une procédure stockée. Les valeurs possibles incluent |
handler N/A |
Gestionnaire (handler) pour la fonction ou la procédure stockée. Snowflake CLI remplit automatiquement ce champ. |
replace Unused |
Snowflake CLI suppose la valeur |
session Requis |
Doit être |
is_permanent Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
stage_location Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
if_not_exists Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
strict Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
secure Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
immutable Unused |
Snowflake CLI n’utilise pas ce champ pour la génération de code SQL. |
native_app_params Facultatif |
(Pour une Snowflake Native App seulement) Dictionnaire Python contenant les paramètres Snowflake Native App suivants :
Bien que techniquement facultatif, ne pas spécifier la propriété |
Lors du téléchargement de vos fichiers Python vers une zone de préparation de destination, Snowflake CLI convertit les décorateurs en commentaires afin que ces UDFs et les procédures stockées ne soient pas créées dans votre session actuelle. Les fichiers sources d’origine ne sont pas modifiés afin que la commande snow app bundle
reste idempotente. Seuls les fichiers Python dans le répertoire racine de déploiement sont modifiés pour contenir les commentaires, car la racine de déploiement est recréée à chaque fois que vous exécutez la commande snow app bundle
. L’exemple suivant illustre comment Snowflake CLI commente les décorateurs.
# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#: return_type=IntegerType(),
#: input_types=[IntegerType(), IntegerType()],
#: packages=["snowflake-snowpark-python==1.15.0"],
#: native_app_params={
#: "schema": "ext_code_schema",
#: "application_roles": ["app_instance_role"],
#: },
#: )
def add_sp(session_, x, y):
return x + y
De plus, seuls les fichiers Python avec une propriété processors
dans le fichier de définition du projet sont impactés.