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:

  1. 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
    
    Copy
  2. Führen Sie in Ihrem Projektverzeichnis den snow app bundle-Befehl aus, um das temporäre output/deploy-Verzeichnis zu erstellen, das Ihre konfigurierten Artefakte enthält.

    snow app bundle
    
    Copy
  3. Ü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
Copy

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;
Copy

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
Copy

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;
Copy

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 Snowpark Sitzung 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.

Python-Decorator-Eigenschaften

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 snowflake-snowpark-python mit oder ohne eine Versionsnummer angeben. Wenn Sie eine Versionsnummer für dieses Paket angeben, verwendet Snowflake CLI die Version nicht für die Generierung von SQL, behält aber die Versionsnummer für alle anderen Pakete in der Liste bei.

Wenn Sie diese Eigenschaft weglassen, fügt Snowflake CLI automatisch snowflake-snowpark-python als einziges Paket hinzu und spiegelt dies in den generierten SQL-Anweisungen wider.

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 dest der Python-Datei im Verzeichnis des Bereitstellungsstamms bestimmt, basierend auf der Projektdefinitionsdatei.

execute_as

Optional

Persona, die bei der Ausführung einer gespeicherten Prozedur verwendet werden soll. Zu den Werten gehören: caller und owner. Wenn nichts angegeben wird, ist Snowflake CLI standardmäßig auf owner eingestellt. Beachten Sie, dass diese Eigenschaft nicht für Funktionen gilt.

handler

N/A

Handler für die Funktion oder gespeicherte Prozedur. Snowflake CLI füllt dieses Feld automatisch aus.

replace

Unused

Snowflake CLI nimmt true für die Code-Erstellung an.

session

Erforderlich

Muss None sein. Wenn nicht angegeben, gibt Snowflake CLI einen Fehler aus.

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:

  • schema: Name des Schemas, das die Snowpark-Funktion oder gespeicherte Prozedur enthalten soll. Dieses Schema muss bereits in Ihrem Setup-Skript definiert sein. Snowflake empfiehlt, den Wert auf den Namen eines versionierten Schemas in Ihrer Setup-Skript-Datei einzustellen. Snowflake CLI stellt diesen Wert dem Namen der Snowpark-Funktion oder Prozedur in der generierten SQL-Anweisung voran. Beachten Sie, dass Snowflake CLI das Schema nicht für Sie erstellt.

  • application_roles: Liste der Anwendungsrollen, die USAGE-Berechtigungen für die generierte Snowpark-Funktion oder Prozedur erhalten sollen. Snowflake CLI erstellt nicht die Anwendungsrollen, sondern nur SQL-Anweisungen wie GRANT USAGE ON FUNCTION <schema_name.func_name> TO APPLICATION ROLE <app_role> und fügt sie dem Setup-Skript hinzu.

Obwohl technisch gesehen optional, kann die Nichtangabe der Eigenschaft native_app_params in Ihrer Datei zur Projektdefinition zu einem ungültigen Setup-Skript führen.

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
Copy

Außerdem sind nur die Python-Dateien betroffen, die eine processors-Eigenschaft in der Projektdefinitionsdatei haben.