You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中格式化SQLAlchemy生成的ERD样式?

问题描述

我已经用Python的SQLAlchemy库生成了动态ERD图,但需要对ERD的样式进行格式化,比如修改实体颜色、关系线条等。以下是我的完整代码:

from sqlalchemy_schemadisplay import create_schema_graph
from sqlalchemy import create_engine, MetaData
import os

# Create a database engine
engine = create_engine('mysql+mysqlconnector://root:ZubairHasan123#@127.0.0.1/sakila')

# Create a metadata object
metadata = MetaData(bind=engine)

# Create a schema graph
graph = create_schema_graph(
    metadata=metadata,
    show_datatypes=True,  # Show data types on the graph
    show_indexes=True     # Show indexes on the graph
)

print(graph)

os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz/bin/'
# graph.write_png('D:\ATS\ERDiagram\ERD\schema_graph.png')
graph.write_svg('D:\ATS\ERDiagram\ERD\schema_graph.svg')
解决方案

sqlalchemy_schemadisplay底层依赖Graphviz的pygraphviz库,生成的graph对象本质是Graphviz的Digraph实例,你可以通过修改该对象的属性来定制ERD样式:

1. 修改全局样式(整体主题)

通过graph.graph_attr定义全局图形属性(如背景色、字体),graph.node_attr定义所有实体节点的默认样式,graph.edge_attr定义所有关系线条的默认样式:

# 在创建graph后添加以下配置
# 全局图形属性
graph.graph_attr.update(
    bgcolor="#f0f8ff",  # 背景色
    fontname="Arial",
    fontsize="12"
)

# 实体节点默认样式
graph.node_attr.update(
    style="filled",
    fillcolor="#a1caf1",  # 实体背景色
    color="#2e4053",      # 实体边框色
    fontname="Arial",
    shape="rectangle"
)

# 关系线条默认样式
graph.edge_attr.update(
    color="#34495e",      # 线条颜色
    penwidth="2",         # 线条粗细
    arrowhead="vee",      # 箭头样式
    fontname="Arial"
)

2. 单独修改特定实体的样式

遍历graph的节点,匹配目标表名后修改其专属样式:

# 修改"actor"表的样式
for node in graph.nodes():
    if node.get_name() == "actor":
        node.attr.update(
            fillcolor="#ffcccb",
            color="#b03a2e"
        )

3. 单独修改特定关系的样式

遍历graph的边,匹配源节点和目标节点后调整关系线条:

# 修改actor与film_actor之间的关系线条
for edge in graph.edges():
    if edge[0] == "actor" and edge[1] == "film_actor":
        edge.attr.update(
            color="#e74c3c",
            penwidth="3",
            arrowhead="dot"
        )

完整修改后的代码

from sqlalchemy_schemadisplay import create_schema_graph
from sqlalchemy import create_engine, MetaData
import os

# Create a database engine
engine = create_engine('mysql+mysqlconnector://root:ZubairHasan123#@127.0.0.1/sakila')

# Create a metadata object
metadata = MetaData(bind=engine)

# Create a schema graph
graph = create_schema_graph(
    metadata=metadata,
    show_datatypes=True,  # Show data types on the graph
    show_indexes=True     # Show indexes on the graph
)

# -------------------------- 样式配置开始 --------------------------
# 全局图形属性
graph.graph_attr.update(
    bgcolor="#f0f8ff",
    fontname="Arial",
    fontsize="12"
)

# 实体节点默认样式
graph.node_attr.update(
    style="filled",
    fillcolor="#a1caf1",
    color="#2e4053",
    fontname="Arial",
    shape="rectangle"
)

# 关系线条默认样式
graph.edge_attr.update(
    color="#34495e",
    penwidth="2",
    arrowhead="vee",
    fontname="Arial"
)

# 单独修改actor表的样式
for node in graph.nodes():
    if node.get_name() == "actor":
        node.attr.update(
            fillcolor="#ffcccb",
            color="#b03a2e"
        )

# 单独修改actor与film_actor的关系线条
for edge in graph.edges():
    if edge[0] == "actor" and edge[1] == "film_actor":
        edge.attr.update(
            color="#e74c3c",
            penwidth="3",
            arrowhead="dot"
        )
# -------------------------- 样式配置结束 --------------------------

os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz/bin/'
graph.write_svg('D:\ATS\ERDiagram\ERD\schema_graph.svg')

注意事项

  • 颜色支持十六进制色值、颜色名称(如red)或RGB值
  • 若未安装pygraphviz,需先执行pip install pygraphviz完成依赖安装

内容的提问来源于stack exchange,提问作者Zubair Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:32:51