ChartDB 1.20.1 快速入门(导入 Schema 到生成 ER 图)
以 MySQL 8.4 演示库为实测对象,走通 ChartDB 1.20.1 从 Smart Query 导入 Schema 到生成可编辑 ER 图的完整流程,覆盖 DDL/DBML 两种导入方式与 SQL/图片导出。
ChartDB 1.20.1 快速入门(导入 Schema 到生成 ER 图)
目标:从零走通 ChartDB 的核心工作流——把一个已有数据库的 Schema 导入 ChartDB 并生成可编辑的 ER(实体关系)图。本文以 MySQL 8.4.11 演示库(4 张表、3 条外键、9 个索引)为实测对象,Smart Query 返回的 JSON 完整通过合法性校验并成功导入,同时覆盖 SQL Script(DDL)与 DBML 两种导入方式及导出操作。已实测环境:ChartDB 1.20.1(http://localhost:18090)+ MySQL 8.4.11。
一、环境信息
- ChartDB:1.20.1(自托管部署,访问地址
http://localhost:18090;部署方式见《ChartDB 1.20.1 Docker Compose 部署指南》) - 演示数据库:MySQL 8.4.11,库名
demo,账号root,密码q1w2e3r4 - 演示库规模:4 张表(customers / products / orders / order_items),18 列,3 条外键,9 个索引
- 浏览器数据存储:IndexedDB(图表保存在浏览器本地,无需注册登录)
二、核心概念与工作原理
ChartDB 是纯前端 Web 应用:所有图表数据存储在你浏览器的 IndexedDB 里,服务端(nginx)只负责提供静态页面。它的工作流是「数据库 → JSON → 图表」:
- ChartDB 生成一段针对目标数据库方言的 Smart Query(一条打包查询);
- 你把这条查询放到自己的数据库里执行,得到一个 JSON 结果(描述库中所有表、列、主键、外键、索引、视图);
- 把 JSON 粘贴回 ChartDB,它解析后在画布上渲染出 ER 图。
💡 技术拓展:把 Schema「搬进」可视化工具的主流方式对比——
方式 原理 优点 缺点 Smart Query(ChartDB 采用) 一条 SQL 查 information_schema 打包成 JSON 免装客户端、只要查询权限、结果即所需 需要手动执行一次查询 全量逻辑备份解析(mysqldump/pg_dump → 解析 DDL) 解析备份文件 离线可得 需要文件访问权,解析器要兼容各版本方言 直连抓取(DBeaver/Navicat) 工具通过 JDBC/驱动直连枚举元数据 一键全自动 需要开放数据库端口给工具所在网络 连接探针 Agent(DrawSQL 等 SaaS) 在数据库侧装只读代理 云端自动同步 需在库侧安装组件,有安全顾虑 ChartDB 选择 Smart Query 路线:不动数据库配置、不装任何组件、最小权限(只需 SELECT information_schema),这也是它「免账号、免直连」卖点的基础。
导入入口支持三种方式(新建图表时的对话框里切换):Smart Query(支持全部 9 种方言)、SQL Script(直接粘贴建表 DDL,ClickHouse 与 Oracle 不支持)、DBML(粘贴 DBML 文本)。
三、准备工作
3.1 准备演示数据库
在 MySQL 中创建演示库与 4 张表(电商订单模型,含主键/外键/索引/注释,便于验证 ER 图的关系连线)。执行以下 DDL:
CREATE DATABASE IF NOT EXISTS demo;
USE demo;
CREATE TABLE customers (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '客户ID',
name VARCHAR(100) NOT NULL COMMENT '客户姓名',
email VARCHAR(200) NOT NULL COMMENT '邮箱',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_customers_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';
CREATE TABLE products (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品ID',
title VARCHAR(200) NOT NULL COMMENT '商品名称',
price DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '单价',
stock INT NOT NULL DEFAULT 0 COMMENT '库存',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
CREATE TABLE orders (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',
customer_id BIGINT UNSIGNED NOT NULL COMMENT '下单客户',
status ENUM('pending','paid','shipped','done') NOT NULL DEFAULT 'pending' COMMENT '订单状态',
amount DECIMAL(12,2) NOT NULL DEFAULT 0.00,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_orders_customer (customer_id),
KEY idx_orders_status (status),
CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
CREATE TABLE order_items (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
order_id BIGINT UNSIGNED NOT NULL COMMENT '所属订单',
product_id BIGINT UNSIGNED NOT NULL COMMENT '商品',
quantity INT NOT NULL DEFAULT 1 COMMENT '数量',
unit_price DECIMAL(10,2) NOT NULL COMMENT '成交单价',
PRIMARY KEY (id),
KEY idx_order_items_order (order_id),
KEY idx_order_items_product (product_id),
CONSTRAINT fk_items_order FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE,
CONSTRAINT fk_items_product FOREIGN KEY (product_id) REFERENCES products (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
验证建表结果:
mysql -uroot -pq1w2e3r4 -e "SHOW TABLES FROM demo;"
实测输出:
Tables_in_demo
customers
order_items
orders
products
3.2 打开 ChartDB 编辑器
浏览器访问 http://<服务器IP>:18090,首次打开出现语言选择对话框(可切换到简体中文),随后进入编辑器空画布。点击左上角 New 按钮新建数据库图表,进入「What is your Database?」数据库类型选择页,开始导入流程。
四、方式一:Smart Query 导入(推荐)
4.1 选择数据库类型
在「What is your Database?」选择页点选数据库类型 MySQL(支持 PostgreSQL、MySQL、SQL Server、MariaDB、SQLite、CockroachDB、ClickHouse、Oracle 等),编辑字段下拉选对应大版本(MySQL 8.x 默认即可),点击 Continue 进入「Import your Database」导入页。
4.2 复制 Smart Query
导入页顶部是方式切换按钮组:Smart Query / SQL Script / DBML,保持默认 Smart Query。页面展示一段为 MySQL 8 生成的打包查询(以 WITH fk_info as ( 开头,约 140 行,对应提示文案「Run this script in your database:」),点击查询文本框右上角的复制按钮取得完整查询。这条查询会从 information_schema 中把当前库的表、列、主键、外键、索引、视图一次性拼成 JSON。
⚠️ 注意:查询只读
information_schema,作用范围是当前连接的默认数据库(SQL 里的DATABASE()),执行前先USE 目标库;或在客户端中选中目标库,否则结果为空。
4.3 在数据库中执行查询
把复制的查询放到 MySQL 客户端执行(本文用命令行演示,先选中 demo 库):
mysql -uroot -pq1w2e3r4 demo -N < mysql8-smart-query.sql > smart-query-output.json
查询返回一行 JSON(实测 7909 字节),结构如下(输出节选,实测首段):
{"fk_info": [{"schema":"demo","table":"orders","column":"customer_id","foreign_key_name":"fk_orders_customer","reference_schema":"demo","reference_table":"customers","reference_column":"id","fk_def":"FOREIGN KEY (customer_id) REFERENCES customers(id) ON UPDATE CASCADE ON DELETE RESTRICT"},{"schema":"demo","table":"order_items","column":"order_id","foreign_key_name":"fk_items_order",...
(输出节选,实测末段,comment 为中文表注释)
..."tables": [...,{"schema":"demo","table":"orders","rows":0, "type":"BASE TABLE","engine":"InnoDB","collation":"utf8mb4_0900_ai_ci","comment":"订单表"},{"schema":"demo","table":"order_items","rows":0, "type":"BASE TABLE","engine":"InnoDB","collation":"utf8mb4_0900_ai_ci","comment":"订单明细表"}], "views":[], "database_name": "demo", "version": "8.4.11"}
用 Python 校验 JSON 合法性与内容完整性(可选步骤,确认复制粘贴过程没有丢内容):
python3 -c "
import json
d = json.loads(open('smart-query-output.json').read())
print('顶层键:', list(d.keys()))
print('tables:', len(d.get('tables',[])), 'fk_info:', len(d.get('fk_info',[])), 'pk_info:', len(d.get('pk_info',[])), 'columns:', len(d.get('columns',[])), 'indexes:', len(d.get('indexes',[])))
"
实测输出:
顶层键: ['fk_info', 'pk_info', 'columns', 'indexes', 'tables', 'views', 'database_name', 'version']
tables: 4 fk_info: 3 pk_info: 4 columns: 18 indexes: 9
4 张表、3 条外键、18 列、9 个索引全部在列,与建表 DDL 一致。
4.4 粘贴 JSON 并导入
回到 ChartDB 导入页,把整行 JSON 粘贴到结果输入框(占位文案「Script results here...」),点击 Import。导入成功后对话框关闭,画布上出现 4 张表卡片及连线。
4.5 认识生成的 ER 图
导入完成后画布内容:
- 每张表渲染为一张卡片:表头是表名与注释(如
customers 客户表),卡片体列出全部字段(图标区分主键 / 普通字段,字段行右侧显示类型与长度); - 表与表之间的连线表示外键关系:
orders.customer_id → customers.id、order_items.order_id → orders.id、order_items.product_id → products.id,连线端点标注基数(1:n); - 点击画布空白处拖动平移,滚轮缩放,拖动表卡片调整布局;
- 右侧边栏按区块组织:Tables(表列表)、Refs(关系列表)、Dependencies、Custom Types、Visuals(Areas 区域 / Notes 便签)、DBML(当前图表的 DBML 文本)。
五、方式二:SQL Script(DDL)导入
没有条件在源库执行查询时(如只有建表脚本、只读备份),可直接粘贴 DDL。两种入口:继续用 4.1 节的导入流程,在导入页顶部按钮组切到 SQL Script;或后续随时从顶部菜单 Actions → Import → SQL 打开同样的对话框。把 3.1 节的 CREATE TABLE 语句(去掉 CREATE DATABASE/USE 两行)整段粘贴进输入框,点击导入即可,ChartDB 会解析 DDL 生成同样的表卡片与关系线。
适用范围与差异:
| 对比项 | Smart Query | SQL Script(DDL) |
|---|---|---|
| 输入来源 | 在目标库执行查询取回 JSON | 任意现成的建表脚本 |
| 信息完整度 | 高(含注释、排序规则、索引基数、视图) | 取决于脚本本身(无 COMMENT 就不显示注释) |
| 支持方言 | 全部 9 种 | 除 ClickHouse、Oracle 外均支持 |
| 适用场景 | 生产库实时反向工程 | 只有 DDL 文件、离线设计稿 |
⚠️ 注意:DDL 导入按所选方言的解析器执行,跨方言脚本(如把 MySQL DDL 粘到 PostgreSQL 类型的图表)可能出现类型解析差异,导入前确认对话框顶部选对了数据库类型。
六、方式三:DBML 导入
DBML(Database Markup Language)是 ChartDB 的内部中间表示,右侧边栏 DBML 区块实时显示当前图表的 DBML 文本(可直接编辑,保存后反向更新画布)。从零开始导入:顶部菜单 Actions → Import → DBML(或 New 流程中把导入方式切到 DBML),粘贴如下文本(与演示库等价的最小示例):
Table customers {
id bigint [pk, increment]
name varchar(100) [not null]
email varchar(200) [not null, unique]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table orders {
id bigint [pk, increment]
customer_id bigint [not null]
status varchar(20) [not null, default: 'pending']
amount decimal(12,2) [not null, default: 0.00]
}
Ref: orders.customer_id > customers.id
粘贴导入后画布出现 2 张表与 1 条关系线。DBML 方式适合从 dbdiagram.io 等工具迁移设计稿,或手工快速起草新模型。
七、图表编辑基础
- 改表结构:点击表卡片上的字段行,右侧面板出现字段属性编辑器(名称、类型、可空、默认值、注释),改动即时同步到画布与 DBML 面板;
- 加字段:卡片底部点击「+」新增字段;
- 建关系:从一个字段的小圆点拖到目标表的目标字段,选择基数(1:1 / 1:n / n:m)后生成关系线;
- 删除对象:选中表/关系后按 Delete(或右键菜单删除);
- 添加独立注释:工具栏选择便签(Note)元素,可钉在画布任意位置。
所有编辑只保存在浏览器 IndexedDB,建议重要图表定期导出(见第八节)。
八、导出
导出入口都在顶部菜单 Actions 下:Export SQL(子菜单选目标方言)与 Export as(子菜单:PNG / JPG / SVG / JSON)。
8.1 导出 SQL(跨方言迁移)
Actions → Export SQL:子菜单列出目标方言——当前图表方言(确定性转换,结果稳定)与 PostgreSQL、MySQL、SQL Server、MariaDB、SQLite(菜单项带 ✨ 标记的走 AI 生成)。未配 AI 时使用内置的确定性转换器(PostgreSQL→MySQL、PostgreSQL→SQL Server 有专门实现),点击 AI 方言项会提示需要配置 OpenAI key(或自建端点)。导出结果在对话框中展示,可复制或下载。
💡 技术拓展:ChartDB 的「AI 导出」与「确定性导出」——确定性导出是代码里写死的类型映射与语法转换规则,结果稳定可复现,目前覆盖 PostgreSQL→MySQL/SQL Server 两条路径;AI 导出把图表结构发给配置好的大模型(OPENAI_API_KEY 或自建端点)生成目标方言 DDL,覆盖任意组合但结果需人工校验。生产迁移建议两者结合:AI 生成 → 人工比对 → 试运行。
8.2 导出 DBML
当前图表的 DBML 实时显示在右侧边栏 DBML 区块,直接全选复制即可(ChartDB 未提供独立的 DBML 文件导出菜单项,DBML 文本即源文件),可作为版本库中的 Schema 设计源文件(文本 diff 友好)。
8.3 导出图片与 JSON
Actions → Export as:PNG(可调清晰度)、JPG、SVG 三种图片格式(底层基于 html-to-image 库渲染画布),另有 JSON 导出完整图表文件(含表/关系/区域/便签全部数据),JSON 文件可通过 Actions → Import → .json 重新导入,适合做备份与跨设备迁移。
💡 说明:JSON 导出/导入是官方的图表备份通道——ChartDB 数据存在浏览器 IndexedDB,清理浏览器数据会导致图表丢失,定期 Actions → Export as → JSON 并保存到文件系统是最简单的备份手段(自动化备份策略见进阶篇)。
九、常见问题(FAQ)
Q1:Smart Query 执行结果为空 JSON(tables 空数组)?
查询的作用域是 DATABASE()(当前连接的默认库)。先 USE demo;(或客户端选中库)再执行;PostgreSQL 则需连对 database(每库独立),并在查询里确认 schema 过滤条件。
Q2:粘贴 JSON 后导入报错或只导入部分表?
常见原因是复制时截断(JSON 是一整行超长文本)。先用 4.3 节的 Python 校验确认 JSON 完整合法;MySQL 还受 group_concat_max_len 限制,超大 schema 建议先执行 SET SESSION group_concat_max_len = 1000000; 再跑 Smart Query(MariaDB 官方脚本已内置该语句,实测值为 10000000)。
Q3:执行 Smart Query 需要什么权限?
只需对 information_schema 的 SELECT 权限(所有用户默认可查自己有权限的库);不写任何数据,不装组件。最低权限账号即可完成导入。
Q4:导入后表卡片重叠看不清? ChartDB 有自动布局:右侧边栏或画布右键菜单中的「Arrange/自动排列」可一键重排;也可手动拖动卡片后用「区域(Area)」功能按业务域分组圈选。
Q5:换浏览器/换电脑图表不见了? 数据在浏览器 IndexedDB 里。跨设备用导出 JSON/DBML → 新设备导入;同机清了浏览器数据同理。长期备份方案见《ChartDB 1.20.1 进阶实战与运维》篇。