Python生成足球数据库Schema图与外键关联表查询问题求助
问题1:数据库Schema展示优化建议
- 自定义可视化ER图方案
你已经完成了最核心的元数据采集工作,可以直接基于graphviz库自行绘制ER图:可自由控制每个表节点的尺寸、展示的字段范围,针对115列的Match表可以选择只展示主键、外键及核心业务字段,或拆分为两个关联节点分别展示核心/扩展字段,所有外键连接逻辑可自行实现,不会出现缺失。
如果不想从零写绘图逻辑,也可以在现有ER生成工具的基础上添加字段过滤逻辑,提前移除Match表中不需要展示的非核心字段后再传入工具生成图表,即可控制输出尺寸。 - 结构化文本+Mermaid示意图方案
如果不需要矢量图格式的ER图,可直接基于你已生成的tables_info做两类优化:- 用
pandas.style模块给DataFrame添加样式:给主键行标背景色、外键行高亮、关联表字段单独标注,可直接在Jupyter中渲染或导出为带样式的HTML文件。 - 用
tabulate库将每个表的元数据转为格式化Markdown表格,再配合Mermaid ER语法绘制关系图,你已采集到的所有外键信息可直接填入Mermaid代码块,所有关联关系都能完整展示,还可自由控制每个表展示的属性数量,完全规避Match表过长的问题。
- 用
问题2:找不到小写country表的解决方法
该问题是SQLite的标识符大小写不敏感特性导致的:你从sqlite_master中查询到的实际表名为首字母大写的Country,但外键定义中存储的引用表名为小写country,二者指向同一个表,只是大小写不匹配导致你无法匹配到已采集的表。
修复只需添加一层大小写统一的映射逻辑即可,对应修改代码如下:
import pandas as pd import sqlite3 as sq db = sq.connect('database.sqlite') cur = db.cursor() tables_names = cur.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall() # 新增:建立小写表名到实际表名的映射 table_name_map = {name[0].lower(): name[0] for name in tables_names} tables_info = {} for name in tables_names: tab_name = name[0] columns_info = cur.execute("PRAGMA table_info("+tab_name+")").fetchall() df = pd.DataFrame(columns_info, columns=['index', 'col_name', 'datatype', 'can_be_null', 'default_val', 'is_PK']) df.set_index('index', drop=True, inplace=True) tables_info[tab_name] = df FKs = cur.execute("PRAGMA foreign_key_list("+tab_name+");").fetchall() df['is_FK'] = 0 df['references'] = 0 for FK in FKs: # 新增:统一转小写匹配实际表名 ref_table_lower = FK[2].lower() actual_ref_table = table_name_map[ref_table_lower] df.loc[df['col_name']==FK[3], 'is_FK'] = 1 df.loc[df['col_name']==FK[3], 'references'] = actual_ref_table +"("+FK[4]+")"
修改后外键关联的小写country会自动匹配到实际存在的Country表,异常即可解决。
内容的提问来源于stack exchange,提问作者Ahmed Elashry
相关产品推荐
相关产品推荐

