dbdiagram.io 可通过 SQL DDL 或直连数据库快速生成带主外键、关系线和字段说明的 ER 图,支持 PNG/SVG/SQL 导出;需确保 DDL 中约束完整或数据库权限开放,SVG 嵌入时中文建议改用 PNG。
怎么用
快速导出可协作的 ER 图
直接把数据库结构变成带关系线、字段说明、主外键标注的图,是团队对齐最省力的方式。
不需要装客户端,支持从 sql ddl(比如
语句)或主流数据库直连生成,导出 png/svg/sql 多种格式。
实操建议:
粘贴 DDL 时,确保每张表的
和
定义完整,否则关系线会缺失
如果用 PostgreSQL/MySQL 直连,需开启
或配置
查询权限,否则部分视图和约束不显示
导出 SVG 后可直接嵌入 Confluence 或 Notion,但注意字体渲染:本地没装对应字体时,中文可能变方块——改用 PNG 更稳妥
别依赖自动生成的“备注”字段:
在 PostgreSQL 中需显式开启注释提取,MySQL 则默认忽略
属性
为什么
+
比纯手工画图更可靠
靠人眼从几百行 SQL 里找外键、推导层级,容易漏掉隐式关联(比如用字符串匹配代替
),而
能解析真实执行计划里的依赖链,
则能提前拦截建表语句中违反规范的写法(如缺失
约束、命名不统一)。
常见错误现象:
报错
:通常是某张表的
里混用了 SQLAlchemy 1.x 和 2.x 的语法
对
识别率低:建议把约束定义全写进
,避免拆分语句
生成的图里出现大量交叉线:不是工具问题,而是表之间存在多对多中间表未被正确定义为独立实体——得补上
这类语句再重跑
团队共享时,ER 图文件怎么放才不会过期
放在 GitHub README 里截图?下次字段一改就失效。最简单的可持续方案,是把 ER 图生成逻辑固化进 CI 流程,每次
后自动更新。
使用场景与参数差异:
用
时,连接串必须带
(开发环境)或配置
(生产环境),否则 CI 会卡在密码输入
如果数据库有上百张表,加
参数限定范围,否则生成的图密密麻麻根本没法看
Confluence 插件
支持导入
,但
默认不输出该格式——得加
别把生成命令写死在 Makefile 里:不同成员本地数据库端口/用户不同,应统一读取
文件中的
DDL 脚本里哪些细节会让 ER 图“看起来对、实际错”
外键指向的字段类型不一致、字符集不同、甚至只是大小写拼写偏差(比如
vs
),都会导致工具判定“无关联”,但业务代码里照样能跑通——这种隐患最难排查。
性能与兼容性影响:
MySQL 中
和
被视为不同字段类型,
不会画连线
PostgreSQL 的域类型(
)会被识别为
,但外键引用该域时,工具可能无法回溯原始定义
SQL Server 的
列若没配
和
,某些解析器会跳过主键标记
所有工具都忽略触发器和存储过程里的隐式关联——这类逻辑必须单独文档化,不能指望 ER 图覆盖
真正难的不是画出来,是让图里每条线都经得起
验证。字段名拼写、类型精度、字符集、约束可见性,这些地方差一点,协作时就得多开三次会来对齐。
dbdiagram.iodbdiagram.iocreate tablePRIMARY KEYFOREIGN KEYpg_stat_statementsinformation_schemaCOMMENT ON COLUMNCOMMENTsqlflufferalchemyJOINeralchemysqlfluffNOT NULLeralchemyAttributeError: 'NoneType' object has no attribute 'name'__table_args__sqlfluffALTER TABLE ADD CONSTRAINTCREATE TABLECREATE TABLE order_product (...)git pusheralchemy -i "postgresql://..." -o erd.png?sslmode=disable.pgpass--include-tablesdrawio.graphmleralchemy-o erd.graphml -t graphml.envDB_URLuser_idUSER_IDVARCHAR(255) CHARSET utf8mb4VARCHAR(255) CHARSET utf8eralchemyCREATE DOMAIN phone_number AS TEXTTEXTIDENTITYSEEDINCREMENTSELECT