テンプレート関数を使用する

データベース名やスキーマ名などの SQL 識別子の連結を可能にし、異なるコンテキストで引用符付き識別子や引用符なし識別子を柔軟に使用できるように、 Snowflake CLI は、プロジェクト・テンプレート定義テンプレートで使用できる以下のユーティリティ関数のセットを提供します。

fn.concat_ids()

  • 入力: 1つ以上の文字列引数(SQL ID またはプレーン文字列)

  • 出力: 有効な SQL ID (引用符で囲まれた、または引用符で囲まれていない)。

fn.concat_ids() 関数は、複数の文字列引数を連結して、 SQL ID (引用符で囲むか囲まないか)を表す1つの文字列にします。入力文字列のいずれかが有効な引用符で囲まれた識別子であれば、連結の前にアンエスケープされます。結果の文字列は、SQL 以外の安全な文字が含まれている場合、または入力文字列のいずれかが有効な引用符で囲まれた識別子であった場合、エスケープされ引用符で囲まれます。

例:

  • fn.concat_ids('id1_', '"quoted_id2"') を呼び出すと、入力値の1つが引用符で囲まれた識別子であるため、 "id1_quoted_id2" を出力します。

  • fn.concat_ids('id1_', 'id2') を呼び出すと:codenowrap:id1_id2 が出力されます。入力値のどれもが引用符で囲まれた識別子ではなく、入力値のどれもが SQL 安全でない文字を含んでいないからです。

fn.str_to_id()

  • 入力: 1つ以上の文字列引数(SQL ID またはプレーン文字列)

  • 出力: 有効な SQL ID (引用符で囲まれた、または引用符で囲まれていない)。

fn.str_to_id() 関数は、文字列を ID として返します。入力文字列が有効な引用符付きまたは引用符なしの識別子を含んでいる場合、関数はそれをそのまま返します。しかし、入力文字列が適切に引用符で囲まれていない安全でない文字(SQL)を含んでいる場合、この関数は安全でない文字をエスケープした引用符で囲んだ ID を返します。

例:

  • fn.str_to_id('id1') を呼び出すと、有効な引用符なしの識別子であるため、 id1 を返します。

  • fn.str_to_id('unsafe "id') を呼び出すと、安全でない SQL 文字が含まれているため、 "unsafe""id" を返します。

fn.id_to_str()

  • 入力: 1つの文字列引数(SQL ID またはプレーン文字列)

  • 出力: プレーンな文字列

入力が有効な SQL ID の場合、この関数はエスケープされていないプレーンなStringを返します。そうでなければ、この関数は入力文字列をそのまま返します。

例:

  • :fn.id_to_str('id1') を呼び出すと、すでに引用されていないため、 id1 を返します。

  • :codenowrap:` fn.id_to_str('"quoted""id.example"')` を呼び出すと、 quoted"id.example を返します。

fn.get_username()

  • 入力: フォールバック値を含むオプションの文字列1つ

  • 出力: Operating Systemから検出された現在のユーザー名

オペレーティング・システムの環境変数から現在のユーザー名を返します。現在のユーザー名が見つからないか空の場合は、空の値を返すか、フォールバック値があればそれを使用します。

例:

  • fn.get_username('default_user') は、見つかった場合は現在のユーザー名を返し、そうでない場合は:codenowrap:default_user を返します。

fn.sanitize_id()

  • 入力: 1つの文字列引数

  • 出力: 引用符で囲まれていない有効な SQL ID

関数:codenowrap:fn.sanitize_id() は、入力から安全でない SQL 文字を取り除き、引用符で囲まれていない有効な SQL ID として返します。結果が文字かアンダースコアで始まらない場合は、アンダースコアを付加します。非常に長い文字列の場合、この関数は文字列を255文字に切り詰めます。

例:

  • fn.sanitize_id('Some.id "With_Special_Chars') を使用すると、出力は:codenowrap:SomeidWith_Special_Chars になります。

  • fn.sanitize_id('1abc') を使用すると、出力は:codenowrap:_1abc となります。

使用例

次の例では、 snowflake.yml プロジェクト定義ファイルでこれらの関数を使用する方法を示します。

definition_version: 2
entities:
  pkg:
    type: application package
    identifier: <% fn.concat_ids(ctx.env.app_name, ctx.env.pkg_suffix) %>
    artifacts:
      - src: app/*
        dest: ./
  app:
    type: application
    identifier: <% fn.concat_ids(ctx.env.app_name, ctx.env.app_suffix) %>

env:
  app_name: myapp_base_name_<% fn.sanitize_id(fn.get_username()) %>
  app_suffix: _app_instance
  pkg_suffix: _pkg
Copy

次の例は、 SQL ファイルでの関数の使い方を示します。

DESC APPLICATION <% fn.str_to_id(ctx.entities.app.identifier) %>;
DESC APPLICATION PACKAGE <% fn.str_to_id(ctx.entities.pkg.identifier) %>;
Copy