mcpField
H
how-to-export-sqlite-tables-to-create-statements

how-to-export-sqlite-tables-to-create-statements

github.com/rodydavisデータ・データベース6042 回インストール2 週間前に更新
リポジトリ

how-to-export-sqlite-tables-to-create-statements について

SQLite データベースを調べ、テーブルとインデックスを CREATE 文として出力する方法を示す Flutter の記事です。実行時にスキーマをエクスポートしたい開発者向けに、sqlite3 と Mustache テンプレートを使用します。

主な機能

  1. 01SQLite からテーブル名を取得
  2. 02PRAGMA で列とインデックスを調査
  3. 03Mustache による CREATE SQL の生成

活用シーン

  1. 01実行時の SQLite スキーマエクスポート
  2. 02テーブルとインデックスの CREATE 文生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/rodydavis/skills --skill how-to-export-sqlite-tables-to-create-statements

インストール後、Claude Code で/how-to-export-sqlite-tables-to-create-statementsを入力して読み込まれたか確認します。

詳細

SQLite のテーブルを CREATE 文にエクスポートする方法

この記事では、実行時にSQLiteデータベース内のすべてのテーブルとインデックスを CREATE 文にエクスポートする方法を説明します。

はじめに

まず、新しいディレクトリを作成し、Flutter プロジェクトを作成します。

mkdir sqlite_introspect
cd sqlite_introspect
flutter create .
flutter pub add sqlite3 mustache_template

これにより、FFI を使用してネイティブ実行ファイルを呼び出す sqlite3 パッケージと、後でテンプレートに使用する mustache が追加されます。

データベースの作成

データベースはメモリ内に作成することも、ローカルファイルを基に作成することもできます。この例では、メモリ内に作成します。

final Database db = sqlite3.openInMemory();

使用後はデータベースを破棄することを忘れないでください。

db.dispose();

テンプレートの定義

Mustache を使用するため、テンプレートに渡す変数を JSON として定義できます。

フィールドとインデックスを格納する TableInfo クラスを作成します。

class TableInfo {
  final String name;
  final List<Map<String, dynamic>> fields;
  final List<Map<String, dynamic>> indexes;

  TableInfo({
    required this.name,
    required this.fields,
    required this.indexes,
  });

  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'fields': [
        for (var i = 0; i < fields.length; i++)
          {
            'index': i,
            'table': name,
            'isLast': i == fields.length - 1,
            ...fields[i],
          },
      ],
      'indexes': [
        for (var i = 0; i < indexes.length; i++)
          {
            'index': i,
            'table': name,
            'isLast': i == indexes.length - 1,
            ...indexes[i],
          },
      ],
    };
  }
}

次に、CREATE 文を生成するために使用する Mustache テンプレートを作成します。

const template = '''
{{#tables}}
CREATE TABLE {{name}} (
  {{#fields}}
  {{name}} {{#type}} {{.}}{{/type}}{{#notnull}} NOT NULL{{/notnull}}{{#pk}} PRIMARY KEY{{/pk}}{{#dflt_value}} DEFAULT {{.}}{{/dflt_value}}{{^isLast}},{{/isLast}}
  {{/fields}}
);
{{#indexes}}
CREATE {{#unique}} UNIQUE{{/unique}} {{name}}
ON {{table}}({{#values}} {{name}} {{/values}}{{^isLast}},{{/isLast}});
{{/indexes}}
{{/tables}}
''';

PRAGMA のエクスポート

データベースのテーブル一覧をエクスポートし、それぞれの列情報とインデックスを照会することで、PRAGMA をエクスポートできます。

final tables = <TableInfo>[];
// Export table names
final tableNames = db
	.select("SELECT name FROM sqlite_master WHERE type='table';")
	.map((e) => e['name'] as String);
for (final t in tableNames) {
  // Export column information
  final info = db.select('PRAGMA table_info($t);');
  final tbl = TableInfo(name: t, fields: [], indexes: []);
  for (final c in info) {
    tbl.fields.add(c);
  }
  // Export index names
  final indexList = db.select('PRAGMA index_list($t);');
  for (final index in indexList) {
    final name = index['name'] as String;
    // Export index information
    final infos = db.select('PRAGMA index_info($name);');
    final indexValue = {...index, 'values': infos};
    tbl.indexes.add(indexValue);
  }
  tables.add(tbl);
}

テンプレートのレンダリング

先ほどエクスポートしたテーブルを Mustache テンプレートに渡してレンダリングします。

final tml = Template(template);
final args = {"tables": tables.map((e) => e.toJson()).toList()};
final str = tml.renderString(args);
print(str);

これで、すべてのテーブルとインデックスが有効な SQL の CREATE 文として出力されます。🎉

コメント