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

这篇 Flutter 指南演示如何检查 SQLite 数据库,并将表和索引渲染为 CREATE 语句。它面向需要在运行时导出数据库结构的开发者,使用 sqlite3 和 Mustache 模板。

主要功能

  1. 01读取 SQLite 表名
  2. 02使用 PRAGMA 检查列和索引
  3. 03通过 Mustache 渲染 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

这会添加 sqlite3 包,该包使用 FFI 调用本机可执行文件;还会添加稍后用于模板的 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 语句。🎉

评论

支持 Markdown