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サンプルを作ってみた。
環境構築 (2022/05/04 追記)
まずは SQL binding 用の拡張機能をインストール。
func extensions install --package Microsoft.Azure.WebJobs.Extensions.Sql --version0.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
のままじゃダメなのか、など諸々気になるが、まだプレビューということで優しく見守る。
作ったサンプルでは、vscodeの tasks.json
でこの手の処理を定義しておいたので、F5 デバッグで自動的にやってくれるはず。
(追記ここまで)
Binding 設定
サンプル/リファレンスから読み解いた設定方法は以下の通り。
Input binding
{"type": "sql", "direction": "in", "name": "employees", "CommandType": "Text", "CommandText": "select * from [dbo].[Employees]", "ConnectionStringSetting": "SqlConnectionString" },
ConnectionStringSetting
に指定している SqlConnectionString
は SQLサーバーの接続文字列を収めたアプリケーション設定名*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 を期待しつつ、温かく見守ろう。