8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Microsoftが提供するVSCode向けのPostgreSQL拡張機能を試してみました。
本記事では、私が個人的に注目している機能の一つである「エージェントモード」を中心に、使い方や使用感をまとめています。
なお、記事公開時点でのバージョンは1.8.0パブリックプレビュー版であり、エージェントモードの機能面からも使用環境は慎重に検討してください。

何ができるのか

この拡張機能では、以下のようなことができます。

  • GUI上でのテーブル、スキーマ、カラムなどの確認
  • スキーマやテーブル構造の可視化
  • SQLクエリの作成と実行
  • GitHub Copilot Chat を使用した自然言語でのデータベース操作 ⭐️
  • Docker経由でPostgreSQLコンテナを簡単に作成 ⭐️

※⭐️は今回実際に使用した機能です。

事前準備

PostgreSQL拡張機能をインストール

VSCodeの拡張機能マーケットプレイスでms-ossdata.vscode-pgsqlと検索し、インストールします。

PostgreSQLで検索すると同名の別拡張機能も表示されるため、識別子であるms-ossdata.vscode-pgsqlでの検索を推奨

Copilotとの統合機能を有効化

エージェントモードを利用するためには、VSCodeの設定から有効化する必要があります。
デフォルトでは、Copilotの統合機能は無効になっています。
有効にするには、VSCodeの設定画面を開き、pgsql copilotと検索します。その後、Pgsql > Copilot : Enable のチェックボックスをオンにします。

スクリーンショット 2025-08-16 13.00.51.png

PostgreSQLコンテナの作成

この拡張機能には、ローカル環境のDockerコンテナ上にPostgreSQLコンテナを簡単に作成できる機能が用意されています。今回は、この方法で作成したコンテナを利用してエージェントモードを試してみます。
なお、利用する前にDockerをインストールし、起動しておく必要があります。

拡張機能のウィンドウから、画像の矢印をクリックして画面の指示に従って進めます。
スクリーンショット 2025-08-16 1.23.20.png

途中で、サーバーのセットアップ画面が表示されるので、各項目を入力し「作成」をクリックすると、コンテナが作成されて起動します。
また、詳細設定からはポート番号やコンテナイメージのバージョンを指定することも可能です。
スクリーンショット 2025-08-16 11.29.00(2).png

エージェントモード

エージェントモードとは?

GitHub Copilot Chat の「Agent Mode」で@pgsqlを利用すると、データベースの操作を自然言語で実行できます。
@pgsqlエージェントは、接続からスクリプトの生成・実行までを自律的に進めますが、最終的な操作にはユーザーの確認が必要となる設計になっています。
※この機能を利用するには、VSCodeでGitHub Copilot Chatが利用可能である必要があります。

運用環境での利用は慎重に行ってください。生成されたSQLは必ず事前に確認し、安全な環境でテストしてから実行するようにしてください。

GitHub Copilot Chatを開く

拡張機能のウィンドウから対象のデータベースを左クリックし、Chat with the databaseを選択します。
すると、必要に応じて次の操作が求められるので手順に沿って進めます。

  • 対象データベースへの接続確認
  • 対象データベースのパスワード入力

スクリーンショット 2025-08-16 11.31.21(2).png

続いて、表示されたチャットウィンドウで「Agent Mode」に切り替えます。
スクリーンショット 2025-08-16 11.31.45(2).png

筆者の環境では、Connect database in Agent Modeでの接続がうまくいかなかったため、チャットウィンドウから直接「Agent Mode」に切り替えました。

テーブル作成を指示してみる

今回は某SNSを模倣したテーブルを作成してみます。
チャットから下記プロンプトを投げます。

@pgsql
以下のMermaid記法で書かれたER図を元にテーブルを作成してください。
また、user_relationshipsテーブルにはfollower_idとfollowee_idの複合ユニークキーを設定してください。

```mermaid
erDiagram
  users ||--o{ posts : ""
  users ||--o{ comments: ""
  posts ||--o{ comments: ""
  users }o--o{ user_relationships: ""


  users {
    bigint id PK
    string name "NOT NULL"
    timestamp created_at "NOT NULL"
    timestamp updated_at "NOT NULL"
  }

  posts {
    bigint id PK
    bigint user_id FK "NOT NULL"
    text content "NOT NULL"
    timestamp created_at "NOT NULL"
    timestamp updated_at "NOT NULL"
  }

  comments {
    bigint id PK
    bigint post_id FK "NOT NULL"
    bigint user_id FK "NOT NULL"
    text content "NOT NULL"
    timestamp created_at "NOT NULL"
    timestamp updated_at "NOT NULL"
  }

  user_relationships {
    bigint id PK
    bigint follower_id FK "NOT NULL"
    bigint followee_id FK "NOT NULL"
    timestamp created_at "NOT NULL"
    timestamp updated_at "NOT NULL"
  }
```

すると、実行されるSQLクエリが表示され実行確認を求められます。内容を確認し、問題がなければ承認して実行を依頼します。

スクリーンショット 2025-08-16 14.45.06(2).png

実行されたSQLクエリ
-- usersテーブル
CREATE TABLE public.users (
    id BIGSERIAL PRIMARY KEY,
    name VARCHAR NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- postsテーブル
CREATE TABLE public.posts (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT NOT NULL REFERENCES public.users(id),
    content TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- commentsテーブル
CREATE TABLE public.comments (
    id BIGSERIAL PRIMARY KEY,
    post_id BIGINT NOT NULL REFERENCES public.posts(id),
    user_id BIGINT NOT NULL REFERENCES public.users(id),
    content TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

-- user_relationshipsテーブル
CREATE TABLE public.user_relationships (
    id BIGSERIAL PRIMARY KEY,
    follower_id BIGINT NOT NULL REFERENCES public.users(id),
    followee_id BIGINT NOT NULL REFERENCES public.users(id),
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    CONSTRAINT unique_follower_followee UNIQUE (follower_id, followee_id)
);

データの作成を指示してみる

チャットから、作成されたテーブルに対してデータ作成を指示してみます。
まずは、ユーザーデータを 1000 件作成するよう指示します。実行されるSQLクエリの確認が求められるので、内容を確認して承認します。

@pgsql
usersテーブルに以下条件のデータを1000件作成してください。
${連番}には、1から1000を順番に割り当ててください。
- name: テスト太郎 ${連番}
- created_at: 現在日時
- updated_at: 現在日時

左ウィンドウからテーブルを選択し、左クリックで「Select Top 1000」を実行すると、レコードの一覧を確認できます。
問題なく作成できていそうです。
スクリーンショット 2025-08-16 14.49.05(2).png

実行されたSQLクエリ
-- SQL例: 1000件のテストユーザーを一括挿入
INSERT INTO users (name, created_at, updated_at)
SELECT
  'テスト太郎 ' || gs::text,
  now(),
  now()
FROM generate_series(1, 1000) AS gs;

続いて、user_relationshipsテーブルに対して、ユニーク制約に違反しないようにデータを作成してみます。

@pgsql
以下のルールに従ってuser_relationshipsテーブルにテストデータを作成してください。
- 作成件数は1000件
- follower_idとfollowee_idの複合ユニーク制約に違反しないデータであること
- follower_idとfollowee_idに同じ値が入らないこと
- follower_idとfollowee_idの組み合わせをランダムにしたい

提案されたSQLクエリが少し複雑だったため解説をお願いし、理解した上で実行を依頼しました。
こちらも問題なく作成されていました。
スクリーンショット 2025-08-16 14.53.06(2).png

実行されたSQLクエリ
INSERT INTO user_relationships (follower_id, followee_id, created_at, updated_at)
SELECT
    r.follower_id,
    r.followee_id,
    now(),
    now()
FROM (
  SELECT
    f.id AS follower_id,
    fe.id AS followee_id
  FROM
    (SELECT id FROM users) f
    CROSS JOIN (SELECT id FROM users) fe
  WHERE
    f.id <> fe.id
  ORDER BY random()
  LIMIT 1000
) r
ON CONFLICT DO NOTHING;

最後に

一通りエージェントモードを試してみました。

この拡張機能の最大の特徴は、自然言語でデータベースを操作できる点だと感じました。
Microsoft製であるためCopilotとの親和性が高く、PostgreSQLデータベースのコンテキスト情報にアクセスすることで、スキーマに沿った正確なSQLクエリの実行や分析情報の生成が可能です。この点は、他のツールにはない大きな魅力だと感じました。

個人的に有用だと感じたのはテストデータの作成です。大量のデータを用意したい場面は稀にありますが、その頻度が低いため、いざという時にすぐSQLを書けないことがあります。そういった場合でも、自然言語からテストデータを生成できるのは大きな利点だと思いました。

一方で、GUI上からは外部キー制約やカラムの詳細情報を確認できず、SQLクエリを実行する必要がありました。またパブリックプレビュー段階ということもあってか、一部で不安定な挙動も見られました。これらの点については、今後の改善に期待したいと思います。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?