ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure Functions in Javascript (Node.js) で SQL binding を試した

C# だけに来てた Azure Functions の SQL binding が、Javascript/Typescript (Node.js) でも動くようになったらしい*1ので試してみた。


https://github.com/Azure/azure-functions-sql-extension/releases/tag/v.0.1.304-preview

何ができるのか

Input/Output binding ができる。トリガーはできない。でもこれは C# も一緒。
トリガーはできなくても、これまでは tedious*2*3 とかを使って自前で接続を書いていたはずなので、それよりずっと楽になる。

が、肝心の JS での設定例が main ブランチに見当たらないので発掘してみると、開発用ブランチで発見。

https://github.com/Azure/azure-functions-sql-extension/tree/maddy/jsSamples/samples/samples-js

これを元に*4サンプルを作ってみた。

github.com


環境構築 (2022/05/04 追記)

まずは SQL binding 用の拡張機能をインストール。

func extensions install --package Microsoft.Azure.WebJobs.Extensions.Sql --version 0.1.304-preview

binding を使うために拡張機能が必要なので、これはわかる。

次がわからない。かつ必須。
上のコマンドでできたであろう ./bin/extensions.deps.json を同じディレクトリーの function.deps.json としてコピーする。

cp ./bin/extensions.deps.json ./bin/function.deps.json

もしかしたら cp ではなく mv でもいいのかもしれないが、念のため元のファイルも残している。

今まで拡張機能のインストールでこの手順を踏んだことがないが、この ./bin/function.deps.json がないと動かないので、今は必要なんだろう。
どこからどういう経緯で参照されているのか、 extensions.deps.json のままじゃダメなのか、など諸々気になるが、まだプレビューということで優しく見守る。

作ったサンプルでは、vscodetasks.json でこの手の処理を定義しておいたので、F5 デバッグで自動的にやってくれるはず。

(追記ここまで)


Binding 設定

サンプル/リファレンスから読み解いた設定方法は以下の通り。

Input binding

    {
      "type": "sql",
      "direction": "in",
      "name": "employees",
      "CommandType": "Text",
      "CommandText": "select * from [dbo].[Employees]",
      "ConnectionStringSetting": "SqlConnectionString"
    },

ConnectionStringSetting に指定している SqlConnectionStringSQL サーバーの接続文字列を収めたアプリケーション設定名*5
CommandText は Binding でデータを取る時に使われる SQL 文。

https://github.com/Azure/azure-functions-sql-extension#input-binding

Output binding

    {
      "type": "sql",
      "direction": "out",
      "name": "employees",
      "CommandText": "dbo.Employees",
      "ConnectionStringSetting": "SqlConnectionString"
    },

ConnectionStringSetting は Input Binding と同じ。
CommandText は Output binding でデータを突っ込むテーブル名。

https://github.com/Azure/azure-functions-sql-extension#output-binding

Output Binding でハマったポイント

注意: 0.1.311-preview で解消済み

最初、Output binding で例外*6が出ていたので issue を立てたら、「カラム名を全部小文字にしてみて」と。
回避策がサクッと出てきたので、問題は把握していていたんだと思う。なので、そう時間はかからずに直るだろう。

OK:

全部小文字だと成功する。

    context.bindings.employees = JSON.stringify([{
      "employeeid": 1,
      "firstname": "Hello",
      "lastname": "World",
      "company": "Microsoft",
      "team": "Functions"
    }])

NG:

DB のテーブルに合わせる感じで大文字を使っちゃうとダメ。

    context.bindings.employees = JSON.stringify([{
      "EmployeeId": 1,
      "FirstName": "Hello",
      "LastName": "World",
      "Company": "Microsoft",
      "Team": "Functions"
    }])

※ テーブル設計

まだプレビューなので、早期の GA を期待しつつ、温かく見守ろう。

*1:と言っても、C# でもプレビュー。

*2:https://www.npmjs.com/package/tedious

*3:なぜこの名前なのか。意味を知ってびっくりした。

*4:ほぼコピー。

*5:ローカル開発なら local.settings.json に書く。

*6:曰く「Primary Key が null だぞ」という内容。