如何在Flutter的sqflite中获取完整数据表结构
在Flutter的sqflite中获取完整数据表结构
要获取SQLite表的完整结构(列名、数据类型、主键、外键等),可以借助SQLite原生的PRAGMA命令,sqflite完全支持执行这些命令,具体方法如下:
获取表的基本列信息(含主键、非空约束等)
使用PRAGMA table_info(your_table_name)命令,它会返回表中每一列的详细信息,包括列名、数据类型、是否为主键、是否允许空值等。
代码示例
Future<List<Map<String, dynamic>>> getTableStructure(Database db, String tableName) async { return await db.rawQuery('PRAGMA table_info($tableName)'); } // 使用方式 // 假设你已经获取了Database实例db var tableStructure = await getTableStructure(db, 'users'); // 打印结果,每一条数据对应一列的信息 tableStructure.forEach((column) { print('列名: ${column['name']}, 类型: ${column['type']}, 主键: ${column['pk'] == 1 ? '是' : '否'}'); });
返回的每条数据包含以下核心字段:
cid: 列的索引(从0开始)name: 列名type: 列的数据类型notnull: 是否为非空约束(1表示非空,0表示允许空)dflt_value: 列的默认值pk: 是否为主键(1表示主键,0表示不是)
获取外键约束信息
使用PRAGMA foreign_key_list(your_table_name)命令,可以获取该表关联的所有外键信息,包括关联的父表、父列、更新/删除规则等。
代码示例
Future<List<Map<String, dynamic>>> getForeignKeys(Database db, String tableName) async { return await db.rawQuery('PRAGMA foreign_key_list($tableName)'); } // 使用方式 var foreignKeys = await getForeignKeys(db, 'orders'); foreignKeys.forEach((fk) { print('外键列: ${fk['from']}, 关联表: ${fk['table']}, 关联列: ${fk['to']}'); });
返回的每条数据包含以下核心字段:
seq: 外键中列的序号(复合外键时有用)table: 关联的父表名称from: 当前表中的外键列名to: 父表中对应的关联列名on_update: 更新父表时的触发动作(如CASCADE、RESTRICT等)on_delete: 删除父表时的触发动作(如CASCADE、RESTRICT等)
批量获取所有表的完整结构
如果需要一次性获取数据库中所有表的结构,可以先通过sqlite_master获取所有表名,再遍历调用上述两个方法:
Future<Map<String, Map<String, dynamic>>> getAllTablesStructure(Database db) async { // 获取所有用户自定义表名(排除SQLite系统表) var tables = await db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"); Map<String, Map<String, dynamic>> allStructures = {}; for (var table in tables) { String tableName = table['name'] as String; var columns = await getTableStructure(db, tableName); var foreignKeys = await getForeignKeys(db, tableName); allStructures[tableName] = { 'columns': columns, 'foreign_keys': foreignKeys }; } return allStructures; }
内容的提问来源于stack exchange,提问作者Satyajyoti Biswas
相关产品推荐
相关产品推荐

