June 2017

Volume 32 Number 6

データ ポイント - Visual Studio Code: MSSQL 拡張機能によるデータベース IDE の作成

Julie Lerman | June 2017

Julie Lerman重要な .NET 開発では相変わらず Visual Studio を主力の IDE にしていますが、個人的にほれ込んでいるのが Visual Studio Code (VS Code) です。Windows または macOS で VS Code を使い、C#、JavaScript、または Node で作業を行っています。もちろん、VS Code とその多くの拡張機能によってサポートされている言語やフレームワークは他にも数多く存在しますが、これらは現在お気に入りのツールセットになっています。VS Code に夢中になっているのは筆者だけではありません。2017 年 3 月の Visual Studio 2017 リリース時、マイクロソフトは VS Code の月間アクティブ ユーザー数が 130 万人だったと発表しました。本当にすばらしいのは、どのクロスプラットフォーム ツールにも言えることですが、チームの各メンバーがそれぞれのお気に入りの OS を選びながら、全員が同じコーディング ツールを使用できる点です。

また、データの存在があります。データは常に関わってきます。長年にわたって SQL Server のみを扱い、Windows アプリケーションのコーディングに時間を費やしてきましたが、ここ数年で視野が広がりました。新しい IDE (VS Code) を使うようになったばかりでなく、新しいデータベースと新しいプラットフォームも利用するようになったのです (その証拠に、本稿は MacBook Pro で執筆しています)。

VS Code は、Node.js の調査の一環として使い始めました。筆者が Node.js に手を出しているのは、これまでこのコラムでお伝えしてきたとおりです。当初は Windows で VS Code を使用していました。ですが、VS Code は (Electron で構築された) クロスプラットフォーム ツールなので、結果的に、同じコードに取り組んでいても、GitHub を共通点にして状況に応じて Windows と macOS を行き来するようになりました。C# 拡張機能と .NET Core のクロスプラットフォーム性により、最終的には Node.js の枠を超え、両方の環境で EF Core を使って .NET Core アプリを開発するようになりました。Visual Studio で作業する場合は、主に組み込み SQL Server Data Tools と SQL CE や SQLite Toolbox 拡張機能を利用して、アプリで生成されるデータのほとんどを調査しています。しかし、VS Code ではデータの調査に何かしら外部ツールが必要になります。Windows と超軽量な VS Code を使用していると、軽量とはお世辞にもいえない SQL Server Management Studio を開くことが適切だとは感じられなくなります。他のデータベースでは、Windows でも Mac でも、大量のデータベースをサポートするクロスプラットフォーム データベース ツール JetBrains DataGrip (jetbrains.com/datagrip、英語) も使っています。

ただし、VS Code の拡張機能の領域は拡大 (2017 年 4 月後半の本稿執筆時点では 3,000 に迫る数まで増大) していて、データ ストアを操作できる拡張機能も多数登場しています。筆者が既に利用しているのは 2 つです。1 つは SQL Server チームの mssql 拡張機能 (bit.ly/2gb2ICf、英語)、もう 1 つは SQLite および PostgreSQL の vscode-database 拡張機能 (bit.ly/2mh8nYF、英語) です。これらを使うと、データベースに対して SQL を作成して実行できます。両拡張機能のデモについては、筆者の Pluralsight のコース「Entity Framework Core: Getting Started」(Entity Framework Core の概要) を参照してください。 他にもデータ関連の拡張機能はあります。たとえば、(同じくマイクロソフトの) Azure Data Lake、Redis、および Salesforce のデータ操作を目的としたものが用意されています。mssql 拡張機能もそうですが、こうした機能の中にはまだプレビュー段階のものもあります。

今回は、mssql 拡張機能を使用する際の基礎についていくつか説明します。本来は mssql および VS Code とデータベースの両方について執筆する予定でしたが、mssql の機能が非常に充実していて、その調査がたいへん楽しかったことで、今回のコラムに割り当てられていた文字数が簡単に埋まってしまいました。mssql を使用する際には、Windows、macOS、または Linux のどれを使っても差はありません。

mssql 拡張機能では、さまざまな SQL Server データベース、つまり Microsoft SQL Server、Azure SQL Database、および SQL Data Warehouse を操作できます。図らずも目の前にあるのが MacBook なので、外部の SQL Server に接続することになります。ご存じかもしれませんが、SQL Server は Linux で実行できるようになっています。驚きでしょう。 つまり、SQL Server を実行する Docker コンテナーを作成できます。今回はこうした取り組みは行いませんが、その方法に関するブログ記事を公開しています。bit.ly/2qaev9r (英語) を参照してください。ただし、今回はクラウドの Azure SQL Server データベースに接続します。Windows 開発者、管理者、C# 開発者でなくても SQL Server を利用することはあるので、次の点についてはしっかり覚えておいてください。SQL Server データベースは Azure Portal で管理でき、どのような種類のアプリからでも接続できます。そこで、PHP のアプリを開発していて、VS Code の PHP 拡張機能を使用し、Azure の SQL Server データベースと通信するとしましょう。 

そのため、無料の Azure アカウントと、Visual Studio サブスクリプションに付属するクレジットを利用して、AdventureWorks サンプルを土台に Azure SQL データベースを作成します。これを行うためのドキュメントについては bit.ly/2o2IDTy を参照してください。

VS Code に戻り、mssql 拡張機能をインストールします。それには、VS Code アクティビティ バーで拡張機能アイコンをクリックし、「mssql」でフィルターをかけ、[インストール] をクリックします。準備が整ったら VS Code を再度読み込むように求められます。ただし、いずれかのコマンドを使用するまで、この拡張機能の一部はインストールが先延ばしにされることに留意してください。注意点として、macOS の場合、OpenSSL をインストールする必要があります。詳細については、(前述の) msqql ドキュメント リンクを確認してください。

クエリ実行エンジンがインストールされることに加え、mssql によって大量のコマンドが VS Code コマンド パレットに配置されます。最初にデータベースに接続することは理にかなっていますが、他の機能を使用する場合でも、まだ接続していなければデータベースに接続するように求められることになります。

F1 キーを押してパレットを開き (たまにある、ファンクション キーを備えていない変わったキーボードを使っている場合は、Ctrl キーまたは Command キーを押しながら Shift キーと P キーを押し)、「MS SQL」と入力してフィルターにかけ、すべての mssql コマンドを選びます。SQL キーワードでコマンドを指定する拡張機能が他にない場合は、「SQL」と入力するだけでもかまいません。「Getting Started Guide」コマンドを使ってヘルプ ファイルにアクセスできるのが個人的にはお気に入りです。また、「Manage Connection Profiles」機能を使うと、さまざまな接続を保存して、簡単に接続することができます。

mssql を操作する最も簡単な方法は、編集用にファイルを開いておいて、SQL を編集中であることが VS Code に認識されるようにすることです。「New Query」コマンドのおかげで、フォルダーを開いていてもプロジェクトを開いていても、これを行うことができます。これにより、SQLQuery.sql ファイルが作成され、この sql 拡張子に基づいて VS Code が mssql エディターに切り替わります。現在のエディターは VS Code の右下隅に示されています。また、エディターはファイルの拡張子に応じて変更され、拡張機能によって提供される適切な IntelliSense と他の関連機能が利用できるようになります。必要であれば、表示されている要素をクリックすることで変更できます。mssql エディターは TSQL の記述に役立つだけではなく、クエリを実行したり、拡張機能で定義された他のタスクを実行することもできます。

エディターで SQL ファイルを開いたまま、[MS SQL: Connect] (MS SQL: 接続) をコマンド パレットから選択すると、作成しておいた既存の接続プロファイルが一覧されます。また、新しい接続プロファイルも作成できます。[Create Connection Profile] (接続プロファイルの作成) を選択すると、接続文字列の重要な各要素を入力するように要求されます。たとえば、まずサーバー名を求められます (図 1 参照)。今回の SQL Azure データベースは、thedatafarmsqlerver.database.windows.net というサーバーに存在するため、この情報を入力します。

mssql 拡張機能による SQL データベースへの接続
図 1 mssql 拡張機能による SQL データベースへの接続

次に、データベース名、ログインとパスワード、およびオプションのプロファイル名を入力するように求められます。ところで、Manage Connection Profiles には [Create] (作成) メニュー オプションがあるため、この機能からでもこの画面に辿り着けます。

接続情報を入力して、正常に接続されたら、VS Code 設定ファイルにプロファイルが保存されます。バージョン 0.3.0 では、接続に失敗した場合プロファイルが保存されません。ただし、このエクスペリエンスは変更される予定です。保存されたプロファイルを確認するには、VS Code メニューから、[基本設定]、[設定] の順に移動するか、Ctrl キーまたは Command キーを押しながらコンマ (,) キーを押します。以下は、接続プロファイルの例です。

"mssql.connections": [
  {
    "authenticationType": "SqlLogin",
    "server": "thedatafarmsqlserver.database.windows.net",
    "database": "AdventureWorksSample",
    "user": "me",
    "password": "mypassword",
    "savePassword": true,
    "profileName": "AzureAWSample"}
  }
]

プロファイルが設定に保存されている場合、接続しようとすると、AzureAWSample や他の保存済みプロファイルを選択できるオプションが表示されます。

接続されたら、TSQL の作成と実行を開始できます。これを行う最も簡単な方法は、sql 拡張子を持つファイルをエディターで開いておくことです。前述のとおり、こうすることで強制的に SQL エディター機能が起動します。そして、その優れた機能の 1 つが組み込み TSQL スニペットです。

エディター ウィンドウで「sql」と入力し始めると、IntelliSense によって組み込みスニペットの一覧が表示されます (図 2 参照)。

mssql 拡張機能により提供される TSQL スニペット
図 2 mssql 拡張機能により提供される TSQL スニペット

この機能は単に既存データをクエリするだけのものではないことがわかります。mssql では (適切かつ許容される) あらゆる TSQL が実行されます。データベース、つまり選択したデータベースのテーブルおよびビューを一覧して、正しいデータベースに接続していることを確認する必要がある場合、ListTablesAndViews スニペットが大きく役立ちます。このような TSQL では、通常なら GoogleBing 博士に助けを求めなければならないでしょう。そのため本当にこのスニペットはありがたく感じます。

Ctrl キーまたは Command キーを押しながら Shift キーと E キーを押すと、コマンドが実行されます。また、テキストを選択して右クリックすると、コンテキスト メニューが表示され、このメニューには [Execute Query] (クエリの実行) オプションが含まれています。

図 3 のような応答を含む結果ペインが表示されます。

スキーマ クエリの結果
図 3 スキーマ クエリの結果

右上に、小さなアイコンが 2 つあることにお気付きでしょうか。1 つ目のアイコンにより、結果を CSV テキスト ファイルとして保存できます。2 つ目のアイコンにより、結果を JSON として保存できます。Customer データを取得するクエリを実行して、その結果がどのようなものになるかを確認し、JSON に保存してみましょう。テーブルの一覧を前面にして、クエリの作成を始めると、図 4 に示すように、IntelliSense が起動してデータベース スキーマの情報が表示されます。

スキーマを読み取って TSQL の作成を支援する IntelliSense
図 4 スキーマを読み取って TSQL の作成を支援する IntelliSense

Sales­LT.Customer の 3 列を取得するように select ステートメントを変更しました。次に、そのステートメントを強調表示して、Ctrl キーまたは Command キーを押しながら Shift キーと E キーを押すキーボード ショートカットをもう一度使用することで、そのクエリだけを実行できます。SQL Server Management Studio と同様、1 つ以上のステートメントを実行し、それに応じて、1 つ以上の結果セットを表示できます。

図 5 に示すように、結果はグリッドに表示されます。1 つ以上の行と列の組み合わせを強調表示してから、CSV アイコンまたは JSON アイコンをクリックできます。これにより、保存先のファイル名を入力するように求められます。また、グリッドを右クリックすると、コンテキスト メニューから簡単にすべてのデータを選択できます。

Customer データのクエリ結果
図 5 Customer データのクエリ結果

ファイル名プロンプトには現在のフォルダー パスが表示されます。その場所にファイルを保存する場合、パスを入力し直す必要はありません。ファイル名を入力するだけで、このフォルダーにファイルが保存されます。筆者の場合、最初の数回はそのことに気が付かなかったので、この失敗を参考にしてください。

クエリが推定する Customer データの 1 列目のみを選択しました。次に、JSON に保存するアイコンを使用して、ファイル名を指定しました。ファイルに出力された JSON は次のようになります。

[
  {
    "CustomerID": "1",
    "FirstName": "Orlando",
    "LastName": "Gee"
  }
]

独自のスニペットを簡単に VS Code に追加できることを覚えておいてください。ストアド プロシージャと関数を一覧するスニペットを作成してみましょう。まず、[基本設定]、[ユーザー スニペット] の順に移動します。mssql 拡張機能によって、SQL スニペットのテンプレートが追加されたことがわかります。これを選択すると、空白のテンプレートが開きます。さらにスニペットを追加するときは、このファイルで作業を続けることになります。また、共有用になんらかのスニペットを作成した場合 (また、バグを見つけたり、mssql の別のアイデアが浮かんだ場合)、これはオープン ソースの拡張機能であるため、github.com/Microsoft/vscode-mssql (英語) に移動して、プル要求や問題を送信することでこれに関与できます。

GoogleBing 博士から長時間の講義を受け、さまざまなアイデアをテストした後に、ターゲット データベースのすべてのストアド プロシージャと関数を一覧する次のスニペットを作成しました。

"List Stored Procedures": {
  "prefix": "sqlListStoredProcedures",
  "body": [
    "SELECT [Name],[Type_Desc] " ,
    "FROM [sys].[all_objects] " ,
    "WHERE ([Type] = 'P' OR [Type]='FN' OR [Type]='TF' OR [Type]='IF') ",
    "AND [Is_MS_Shipped] = 0"
  ],
  "description": "List Stored Procedures"
}

ここで、エディター ウィンドウに「sql」と入力すると、そのオプションの中に sqlListStoreProcedures が表示されます。このコマンドをターゲット データベースに対して実行した結果は次のとおりです。

Name                         Type_Desc
uspPrintError                SQL_STORED_PROCEDURE
uspLogError                  SQL_STORED_PROCEDURE
ufnGetAllCategories          SQL_TABLE_VALUED_FUNCTION
ufnGetSalesOrderStatusText   SQL_SCALAR_FUNCTION
ufnGetCustomerInformation    SQL_INLINE_TABLE_VALUED_FUNCTION

結果のグリッドを右クリックし、[Copy with headers] (ヘッダー付きでコピー) オプションを選択することで、この出力を共有できました。

深夜のテレビ コマーシャルのセリフみたいですが、 これで終わりではありません。 エディター ウィンドウにもコンテキスト メニューがあります (図 6 参照)。

エディター ウィンドウのコンテキスト メニュー
図 6 エディター ウィンドウのコンテキスト メニュー

私見ですが、この中で最も興味深い項目は [定義へ移動] と [定義をここに表示] です。エディター ウィンドウでテーブル名を選択している場合、たとえば、図 5 に示されたコマンドの Customer を選択している場合は、これらのコマンドによって Customer テーブルの CREATE スクリプトが表示されます。

mssql 拡張機能は常に進化を続けているため、今後の更新が楽しみです。今回説明したバージョン 0.3.0 はまだプレビュー段階です。Visual Studio Code に mssql 拡張機能をインストールしている場合は、更新されたら通知されます。その進化を見守ったり、進化の過程に参加するには、aka.ms/mssql-marketplace (英語) の GitHub サイトを参照してください。


Julie Lerman は、バーモント ヒルズ在住の Microsoft Regional Director、Microsoft MVP、ソフトウェア チームの指導者、およびコンサルタントです。世界中のユーザー グループやカンファレンスで、データ アクセスなどのトピックについてプレゼンテーションを行っています。彼女のブログは thedatafarm.com/blog (英語) で、彼女は O'Reilly Media から出版されている『Programming Entity Framework』(2010 年) および『Code First』版 (2011 年)、『DbContext』版 (2012 年) を執筆しています。彼女の Twitter (@julielerman、英語) をフォローして、juliel.me/PS-Videos (英語) で彼女の Pluralsight コースをご覧ください。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Kevin Cunnane、Eric Kang、および Sanjay Nagamangalam に心より感謝いたします。