免费工具
SQLite 转 ER 图
粘贴 sqlite3 执行 .schema 或 .dump 的输出,即可得到包含表、键和外键的 ER 图,没有类型的列也会显示。试试笔记应用示例:笔记本、笔记、标签,以及把笔记和标签关联起来的表。
示例输出
使用方法
粘贴或拖入模式
.schema 或 .dump 的输出、用 SQL 编写的迁移文件,或从任意 SQLite 工具复制的 CREATE TABLE 语句都可以。
查看表和关联
每张表会变成一张带有列的卡片;无论外键检查是否开启,每个 REFERENCES 子句都会成为一条指向被引用表的连线。
在 Archboard 中打开
保存为新图表后,可以重新排列、添加注释、分享链接,或导出为 SVG 和 PNG。注册只需 Google 或 GitHub 账号。
从 SQLite 文件导出数据库结构
在数据库文件所在位置运行以下命令,然后粘贴输出:
.schema 输出所有 CREATE 语句,不含数据行;.dump 在此之外还会输出数据,这些数据会被跳过。把 app.db 换成文件名,或加上 > schema.sql 保存输出,再拖入该文件。
sqlite3 app.db .schema
模式中的 SQLite 语法
sqlite3 输出中各语法结构的处理方式:
INTEGER PRIMARY KEY- 标为 PK。该列就是表的 rowid,其他表可以通过 REFERENCES 引用它。
AUTOINCREMENT- 作为主键的一部分读取,不单独显示。SQLite 的写法没有下划线,与 MySQL 的 AUTO_INCREMENT 不同。
CREATE TABLE note_tags (note_id, tag_id)- 会读取。没有声明类型的列只显示名称,不显示类型,其上的键照常计算。
WITHOUT ROWID · STRICT- 作为表选项跳过;表、列和主键照常读取。
sqlite_sequence- 隐藏。SQLite 会为 AUTOINCREMENT 创建这张表,.schema 也会输出它,但它不属于应用本身的设计;.dump 只用 INSERT 行向它写入数据,这些行会被跳过。
CREATE TRIGGER- 跳过并计数。BEGIN … END 中的分号会被正确处理,因此触发器之后的表仍会被读取。
SQLite 图表不包含的内容
- 触发器和视图。它们的主体会被跳过并计数,所以它们执行的操作不会出现在图上。
- SQLite 自己的内部管理表,例如 sqlite_sequence 和 sqlite_stat1。名称以 sqlite_ 开头的表都会隐藏。
- 外键是否被强制执行。SQLite 中 PRAGMA foreign_keys 默认关闭,而图表无论该设置如何,都会画出每个已声明的 REFERENCES。
- 数据库文件本身。这里无法打开 .db 文件,因此不显示页大小、行数和已存储的数据行;请改为粘贴 .schema 的文本。
SQLite 常见问题
应该用 .schema 还是 .dump?
.schema 只输出 CREATE 语句,所以更短。.dump 会把每一行作为 INSERT 语句写在 BEGIN TRANSACTION 和 COMMIT 之间,这样也可以,因为数据行会被跳过。只想输出一张表时,给 .schema 加上表名,例如 .schema notes。
为什么有些列没有类型?
SQLite 允许声明不带类型的列,例如 CREATE TABLE note_tags (note_id, tag_id)。图表会显示这类列的名称,类型留空。在 STRICT 表中,每一列都有类型,并按原样显示。
为什么我的表之间没有连线?
连线来自 REFERENCES 子句和 FOREIGN KEY 约束。很多应用从不声明它们,只保存 ID,这样就没有可画的连线。只要模式中声明了它们,无论 PRAGMA foreign_keys 是否开启,连线都会出现。
可以为移动应用的 SQLite 数据库生成图表吗?
可以。把数据库文件从设备或模拟器复制到电脑上,运行 sqlite3 app.db .schema,然后粘贴输出。桌面应用、Electron 应用,以及 Django 或 Rails 的本地开发数据库也可以这样做。
粘贴模式时会保存什么吗?
预览不会被保存。选择“在 Archboard 中打开”后,绘制出的图表,包括表卡片、列名和类型以及连线,会作为新图表保存到你的工作区中。之后对 .db 文件的修改不会更新它。
SQLite ER 图工具免费吗?
是的。粘贴模式和查看图表无需账号。在 Archboard 中打开图表需要一个免费账号。