2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Difyで非構造化データからINSERT SQL文を自動生成するまで

Posted at

初めに

こんにちは。
最近「非構造化データをテーブルに突っ込みたいけど、INSERT文を手書きするのは面倒…」という悩みがチーム内で発生しました。
そこで Dify(低コードLLMオーケストレーションツール)を使って「非構造化テキスト → Oracle SQL INSERT文」をワンクリックで自動生成するワークフローを作ってみました。
今回はその構築手順を Qiita 初投稿としてまとめます。


完成イメージ

完成したワークフローは以下のような流れです。

全体フロー

  1. 長文を投げる
  2. テーブル定義を自動取得
  3. LLM が最適な INSERT 文を生成
  4. 実行可能な SQL が出力される

手順詳細

1. Start ノードに「query」と「table_name」を追加

Dify の Workflow エディタで「Start」ノードを開き、入力フィールドを 2 つ追加します。

フィールド名 説明
query 文字列 挿入したい非構造化テキスト(長文 OK)
table_name 文字列 INSERT 先のテーブル名

Start ノード

文字数制限が厳しい場合があるので、query の「最大長」は大きめに設定しておくと安心です。

最大長設定


2. Database ツールで「Get Table Schema」を実行

続けて「Database」ツールを配置し、以下のように設定します。

  • Action: Get Table Schema
  • Table Name: {{start.table_name}}

Get Table Schema

これで実行時に動的にスキーマ情報が取得されます。


3. Table Schema を文字列化する Code ノード

LLM に渡すために、取得したスキーマをプレーンテキストに変換します。
Python コード例:

def main(schema_dict: dict) -> str:
    # dict → CREATE TABLE 風文字列に整形
    columns = []
    for col in schema_dict.get("columns", []):
        columns.append(f"{col['name']} {col['type']}")
    return "CREATE TABLE " + schema_dict["name"] + "(\n  " + ",\n  ".join(columns) + "\n);"

Code ノード


4. LLM ノードで INSERT SQL を生成

最も重要な LLM ノードの設定です。

  • Model: grok-3 など高機能モデルを推奨
  • SYSTEM プロンプト:
## 役割
あなたはOracle SQLの専門家です。テーブル定義を正確に理解し、ユーザーの要求に基づいて適切なINSERT SQL文を生成することが役割です。

## 入力形式
- テーブル定義: ---table_definition--- セクション
- ユーザークエリ: ---query--- セクション

## 出力要件
1. 生成されたINSERT SQL文のみを出力
2. 説明文・コメントは一切出力しない
3. Oracle SQLとして文法的に正しいこと

## 処理ガイドライン
- カラム名・型・制約を正確に把握
- 非構造化テキストから必要な値を抽出
- 文字列はシングルクォート、日付は TO_DATE 等、データ型に応じた記法を使用
- 必須カラムは必ず値を設定
- 複数レコード挿入の場合は、UNION ALL 構文を使用

---

## 入力セクション

---table_definition---
{{context}}

  • USER プロンプト

### ユーザークエリ

---query---

{{start.query}}

LLM ノード


5. 末尾の「;」を除去する Code ノード

アプリケーションによっては「;」が不要な場合があるので、簡易コードで削除します。


def main(text: str) -> dict:
    return {
        "result": text.rstrip(';'),
    }

セミコロン除去


6. End ノードで SQL を返却

最後に End ノードを配置し、出力変数に {{code_2.result}} を指定。

End ノード


動作例

image.png


まとめ

以上、Dify を使って「非構造化データ → INSERT SQL」を自動化するワークフローの紹介でした。
・ノーコードで高速にプロトタイピング
・LLM の指示をシンプルに保つことで精度向上
・スキーマ取得も動的に行えるため、テーブル変更に柔軟に対応

社内で CSV 変換ツールを作る前に、まず Dify で検証してみるとコストを大幅に削減できます。
気になる方はぜひお試しください!

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?