Vorbereiten eines lokalen Ordners mit konfigurierten Snowflake Native App-Artefakten¶
Erstellen Sie einen lokalen Ordner mit konfigurierten Artefakten¶
Der Befehl snow app bundle
erstellt ein lokales Verzeichnis in Ihrem Projekt, füllt es mit der Struktur auf, die Sie in der Projektdefinitionsdatei angegeben haben, und generiert CREATE FUNCTION- oder CREATE PROCEDURE-Deklarationen in Snowflake Native Apps Setup-Skripten aus Snowpark Python-Code, der Decorators (wie @sproc
oder @udaf
) enthält. Weitere Informationen finden Sie in der Snowpark Python-Dokumentation zu dem von Ihnen gewählten Funktions-Decorators, z. B. snowflake.snowpark.functions.udaf.
Die Befehle snow app deploy
und snow app run
nutzen diese Funktionalität bereits. Mit dem expliziten Befehl snow app bundle
können Sie dieses Verzeichnis nun jedoch erkunden, bevor es in den Stagingbereich hochgeladen wird, um zu überprüfen, ob die Artefakte wie erwartet erstellt wurden.
Um einen lokalen Ordner mit den konfigurierten Artefakten zu erstellen, gehen Sie wie folgt vor:
Erstellen oder überprüfen Sie Ihre Snowflake-
snowflake.yml
-Projektdefinitionsdatei, z. B.: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
Führen Sie in Ihrem Projektverzeichnis den
snow app bundle
-Befehl aus, um das temporäreoutput/deploy
-Verzeichnis zu erstellen, das Ihre konfigurierten Artefakte enthält.snow app bundle
Überprüfen Sie, ob der Inhalt des Ausgabe- oder Bereitstellungsverzeichnisses den Regeln entspricht, die Sie in der snowflake.yml.-Datei angegeben haben. Wenn Sie die Snowpark-Anmerkungsverarbeitung in Ihren Python-Dateien aufgerufen haben, können Sie den generierten Code in dem geänderten Setup-Skript im Verzeichnis sehen.
Weitere Informationen finden Sie unter dem Befehl snow app bundle.
Generieren von SQL-Code mit der Snowpark-Anmerkungsverarbeitung¶
Als Snowflake Native App-Entwickler mit einem begrenzten SQL-Hintergrund finden Sie es vielleicht mühsam, Setup-Skripte zu schreiben und zu pflegen, die mit der Zeit recht umfangreich und kompliziert werden können. Setup-Skripte enthalten die gesamte Anwendungslogik, die ein Kunde mit seinen Daten verwenden kann, und sind daher ein erforderlicher Teil der Entwicklung einer Snowflake Native App. Eine der wichtigsten Komponenten von Setup-Skripten ist Ihre Möglichkeit, Snowpark Python-Erweiterungsfunktionen für Funktionen und gespeicherte Prozeduren zu verwenden. Zusätzlich zum Schreiben von Snowpark-Code in Python, Java oder anderen von Snowpark unterstützten Sprachen müssen Sie die entsprechenden Teile dieser Funktionen und Prozeduren unter SQL in das Setup-Skript schreiben.
Sie können zum Beispiel eine grundlegende Funktion und eine gespeicherte Prozedur mit Snowpark Python erstellen, wie in der Abbildung gezeigt:
# 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
Sie müssen dann die Datei in einen Stagingbereich hochladen und im Setup-Skript-SQL-Code darauf verweisen, ähnlich wie im Folgenden:
-- 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;
Automatische SQL-Code-Erstellung¶
Bemerkung
Um die Vorteile der automatischen SQL-Code-Generierung zu nutzen, müssen Sie Snowpark Python Version 1.15.0 und höher verwenden.
Um Ihnen diese zusätzliche Arbeit zu ersparen, kann Snowflake CLI automatisch die erforderliche SQL für Ihre Setup-Skripte generieren. Snowpark Python unterstützt ein Feature namens Erweiterungsfunktions-Decorators (@udf
, @sproc
, @udtf
und @udaf
), mit denen Sie Ihren Python-Code mit Anmerkungen versehen können, z. B. mit dem snowflake.snowpark.functions.udf-Funktions-Decorator. Snowflake CLI kann diese Decorators verwenden, um automatisch den notwendigen SQL-Code für Ihre Setup-Skripte zu erstellen und zu validieren.
Sie können zum Beispiel den @udf
-Decorator für die Funktion im vorherigen Beispiel verwenden:
# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
return 'echo_fn: ' + str
Die Verwendung des @udf
-Decorators weist Snowflake CLI snow app bundle (und andere Befehle, die intern den Befehl snow app bundle
aufrufen) an, die Snowpark Python-Decorators zu verarbeiten, die entsprechenden SQL-Befehle zu generieren und sie automatisch in das Setup-Skript einzubinden, wie gezeigt. So können Sie den Umfang des SQL-Codes, den Sie für Ihr Setup-Skript schreiben müssen, minimieren.
-- 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;
Verwendung der Snowpark Python-Decorators¶
Während die Snowpark-Decorators in Snowflake CLI genauso funktionieren wie die regulären Snowpark-Python-Decorators, sollten Sie die folgenden Unterschiede beachten, wenn Sie Python-Code-Dateien speziell für eine Snowflake Native App schreiben:
Sie können in diesen Dateien keine
Sitzungs
-Objekte verwenden, da Snowflake CLI diese Python-Dateien in einer Sandbox-Umgebung ohne Verbindung zu Snowflake ausführt. Infolgedessen führt jeder Verweis auf eine SnowparkSitzung
zu einem Fehler.Sie können nur die Snowpark Python-Decorators
@udf
,@sproc
,@udaf
und@udtf
verwenden.Sie können diese Decorators nicht als reguläre Funktionen verwenden, um Ihren Code als Snowflake-Objekt zu registrieren. Nur Code, der explizit mit den unterstützten Decorators kommentiert ist, wird erkannt. Daher muss die Python-Funktion eine benannte Funktion sein. Lambda-Funktionen werden nicht unterstützt.
Snowflake CLI erzeugt immer CREATE OR REPLACE-Anweisungen, wie von Snowflake empfohlen, um Funktionen und Prozeduren in Ihren Setup-Skripten zu erstellen.
Weitere Informationen zu Decorator-Eigenschaften¶
Die folgende Tabelle listet die Eigenschaften des Python-Decorators auf und erklärt, wie Snowflake CLI sie verwendet.
Eigenschaft |
Details |
---|---|
name Optional |
Name der Funktion oder gespeicherten Prozedur, die Snowflake CLI verwendet, um die SQL-Anweisungen zu generieren. Wenn Sie diese Eigenschaft weglassen, verwendet Snowflake CLI den Namen der Python-Funktion, um die SQL-Anweisungen zu generieren. |
input_types Erforderlich |
Typen für jeden Eingabeparameter für diese Funktion oder gespeicherte Prozedur. Sie müssen diese Informationen entweder in diesem Decorator-Parameter angeben oder Typanmerkungen direkt in Ihrem Code bereitstellen. Wenn diese Informationen an keinem der beiden Speicherorte verfügbar sind, erzeugt Snowflake CLI keine SQL-Anweisungen für diese Funktion oder gespeicherte Prozedur. |
return_type Erforderlich |
Typ des Rückgabewerts für diese Funktion oder gespeicherte Prozedur. Sie müssen diese Informationen entweder in diesem Decorator-Parameter angeben oder eine Typanmerkung direkt in Ihrem Code bereitstellen. Wenn diese Informationen an keinem der beiden Speicherorte verfügbar sind, erzeugt Snowflake CLI keine SQL-Anweisungen für diese Funktion oder gespeicherte Prozedur. |
packages Optional |
Auflistung der Pakete. Sie können Wenn Sie diese Eigenschaft weglassen, fügt Snowflake CLI automatisch |
imports Optional |
Auflistung der Dateien, die Ihre Snowflake-Funktion oder gespeicherte Prozedur aus dem Stagingbereich importieren muss. Sie können sie entweder als Zeichenfolge oder als Tupel von Zeichenfolgen angeben. Wenn Sie ein Tupel angeben, verwendet Snowflake CLI nur die Zeichenfolge am 0. Index. Ein Beispiel für die Verwendung eines Tupels finden Sie unter Externe Python-Dateien verwenden. Wenn Sie keine Importe angeben, fügt Snowflake CLI automatisch einen Import für die Python-Datei hinzu, die die Funktion oder gespeicherte Prozedur enthält, für die es SQL generiert. Der Pfad des Imports wird durch den Parameter |
execute_as Optional |
Persona, die bei der Ausführung einer gespeicherten Prozedur verwendet werden soll. Zu den Werten gehören: |
handler N/A |
Handler für die Funktion oder gespeicherte Prozedur. Snowflake CLI füllt dieses Feld automatisch aus. |
replace Unused |
Snowflake CLI nimmt |
session Erforderlich |
Muss |
is_permanent Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
stage_location Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
if_not_exists Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
strict Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
secure Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
immutable Unused |
Snowflake CLI verwendet dieses Feld nicht für die SQL-Erstellung. |
native_app_params Optional |
(Nur für eine Snowflake Native App) Python-Dictionary mit den folgenden Snowflake Native App-Parametern:
Obwohl technisch gesehen optional, kann die Nichtangabe der Eigenschaft |
Wenn Sie Ihre Python Dateien in einen Stagingbereich hochladen, wandelt Snowflake CLI die Decorators in Kommentare um, so dass diese UDFs und gespeicherten Prozeduren nicht in Ihrer aktuellen Sitzung erstellt werden. Die ursprünglichen Quelldateien werden nicht verändert, so dass der Befehl snow app bundle
idempotent bleibt. Nur die Python-Dateien im Verzeichnis des Bereitstellungsstamms werden so geändert, dass sie die Kommentare enthalten, da der Bereitstellungsstamm jedes Mal neu erstellt wird, wenn Sie den Befehl snow app bundle
ausführen. Das folgende Beispiel veranschaulicht, wie Snowflake CLI Decorators kommentiert.
# 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
Außerdem sind nur die Python-Dateien betroffen, die eine processors
-Eigenschaft in der Projektdefinitionsdatei haben.