如何在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
相关产品推荐
相关产品推荐

