如何获取Odoo 8数据库表ER图?Odoo新手技术求助
获取Odoo 8数据库表ER图的实用方法
作为曾经折腾过Odoo 8的过来人,我来给你分享几个能生成ER图的实用方法——毕竟600多张表的规模,直接全量生成确实容易乱,得选合适的方式:
方法1:利用Odoo内置开发者工具(快速查看单表关联)
如果你只是想查看特定表的关联关系,Odoo自带的开发者模式就能满足需求:
- 先开启开发者模式:登录Odoo后,点击右上角头像,选择「关于Odoo」,在弹出的页面里找到「开启开发者模式」按钮(Odoo 8的入口就在这里)。
- 开启后,顶部菜单会多出「设置」→「技术」→「数据库结构」→「模型」选项,点进去就能看到所有Odoo模型对应的数据库表。
- 点击任意模型,在页面下方的「关联字段」区域就能看到该表和其他表的外键关联,不过这个方法更适合单表或小范围表的关系查看,全量600多张表的话会很零散。
方法2:用PostgreSQL可视化工具生成全量/自定义ER图
Odoo底层用的是PostgreSQL数据库,直接用支持PostgreSQL的可视化工具来生成ER图是最省心的全量方案:
- pgAdmin(官方工具):连接上你的Odoo 8数据库后,找到对应数据库→「工具」→「ER图生成器」,可以选择全部表或者手动筛选需要的表,还能拖拽调整布局,生成后可以导出为图片或PDF。针对600多张表,建议先按模块筛选(比如只选
sale_、purchase_开头的表),不然图会拥挤到没法看。 - DBeaver(通用工具):这是个跨平台的数据库管理工具,支持几乎所有主流数据库。连接PostgreSQL后,右键点击目标数据库,选择「生成ER图」,可以自定义要包含的表、是否显示字段、关联关系样式,导出格式也很丰富,非常适合大规模表的ER图生成。
方法3:用Python脚本自定义生成(灵活控制需求)
如果你需要更个性化的ER图(比如只生成特定业务模块的表、自定义节点样式),可以写个简单的Python脚本实现:
首先安装依赖:
pip install psycopg2-binary graphviz
(注意:Windows用户需要额外安装Graphviz软件包,Ubuntu用户可以用sudo apt install graphviz安装)
然后参考这个示例脚本:
import psycopg2 from graphviz import Digraph # 替换成你的数据库信息 DB_CONFIG = { 'dbname': 'your_odoo_database_name', 'user': 'postgres', 'password': 'your_postgres_password', 'host': 'localhost' } # 连接数据库 conn = psycopg2.connect(**DB_CONFIG) cur = conn.cursor() # 查询所有外键关联关系 cur.execute(""" SELECT tc.table_name AS source_table, kcu.column_name AS source_column, ccu.table_name AS target_table, ccu.column_name AS target_column FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = 'public' """) # 初始化ER图对象 er_graph = Digraph('Odoo8_ER_Diagram', format='png', node_attr={'shape': 'box'}) # 添加表节点和关联边 for row in cur.fetchall(): source_table, source_col, target_table, target_col = row # 添加表节点(避免重复添加) if source_table not in [node.name for node in er_graph.nodes()]: er_graph.node(source_table) if target_table not in [node.name for node in er_graph.nodes()]: er_graph.node(target_table) # 添加关联边 er_graph.edge(source_table, target_table, label=f"{source_col} → {target_col}") # 生成并保存ER图,同时打开预览 er_graph.render('odoo8_er_diagram', view=True) # 关闭数据库连接 cur.close() conn.close()
这个脚本会自动抓取所有外键关联,生成可视化的ER图,你可以根据需求修改查询语句(比如只筛选特定前缀的表),或者调整图的样式参数。
小提示
对于600多张表的规模,不建议直接生成全量ER图,最好按业务模块拆分(比如销售、库存、财务等),分模块生成后再整合,这样可读性会高很多。
内容的提问来源于stack exchange,提问作者Shahjalal




