从 Postgresql 表中绘制表和关系

Posted

技术标签:

【中文标题】从 Postgresql 表中绘制表和关系【英文标题】:Plot tables and relationships from Postgresql tables 【发布时间】:2013-10-27 02:30:12 【问题描述】:

是否可以使用 R 绘制 postgresql 数据库中的表及其关系,如下所示?

【问题讨论】:

可能不会。但是请查看this question 和this website。 ***.com/questions/3223770/… @Denis 这是我链接的同一个问题。 【参考方案1】:

是的,这是可能的。

至于怎么可能,看下面的步骤

步骤

    连接到 PostgreSQL 数据库 获取数据库的架构信息 将架构信息存储在数据结构中/将数据帧中的数据重新排列到数据结构中。 从数据结构生成图表

第 1 步

为了从 R 连接到 PostgreSQL 数据库,有多种机制可以这样做,包括

    RPostgreSQL(R 到 PostgreSQL,持久连接) sqldf(R 到 PostgreSQL,临时连接自动执行步骤 3 的一部分),它具有 RPostgreSQL 作为依赖项。 PL/R(PostgreSQL 转 R) db.r(R 到 PostgreSQL,内置了基本的数据库可视化,例如部分步骤 2、3、4,)

RPostgreSQL 中步骤 1 的示例如下:

library(RPostgreSQL)

## loads the PostgreSQL driver
drv <- dbDriver("PostgreSQL")

## Open a connection
con <- dbConnect(drv, dbname="databasename")

第 2 步

这可以通过多种方式完成。可以直接在SQL中完成,也可以使用

RPostgreSQL 的 dbListTables 和 dbListFields 或两者的组合。

例如 SQL 查询数据库中的所有表,或表中的所有字段/列或表中的所有约束,请参阅以下 *** 答案

PostgreSQL Describe Table Show tables in PostgreSQL List all tables in PostgreSQL information schema How do I list all columns for specified table DBA StackExchange PostgreSQL to list foreign keys(您只需从 where 子句中删除或修改约束类型即可获取外键和主键)

总而言之,您只需查询 information_schema.tables、information_schema.columns 和 information_schema.table_constraints 以获得您需要的信息。如果速度是一个问题(上面链接的答案中提到了它们),您可以使用 PostgreSQL 特定表而不是 ANSI SQL 标准表,但它们可能会随着时间而改变。

这里的步骤是

    获取表列表 遍历表列表并获取每个表的列(或者,只需使用在结果集中包含表名和列名的查询来查询所有列) 遍历表列表并交替获取每个表的约束,只需使用在结果集中包含表名和约束名的查询查询所有列)

RPostgreSQL 步骤 2 的示例如下:

调整您的 SQL 以适应。

第 1 部分

获取表格列表

使用内置函数

tables1 <- dbListTables(con)

使用 SQL

tables2 <- dbGetQuery(con, "select table_name from information_schema.tables")

第 2 部分

使用内置函数

您将使用 dbListFields(con,"TableName"),并应用于表的前一个数据框。查看how to apply a function to every row of a matrix (or a data frame) in R 或Apply a function to each row in a data frame in R 并将结果保存到变量中。

使用 SQL

columns2 <- dbGetQuery(con, "select table_name,column_name from information_schema.columns")

第 3 部分

使用 SQL

constraints <- dbGetQuery(con, "select table_name,constraint_name, constraint_type from information_schema.table_constraints")

第 3 步

从第 2 步开始,您应该有表格列表、表格列表及其关联的字段/列,以及表格列表及其关联的约束。

您需要为 CityPlot 输出一个 csv 文件以供使用,或为 GraphViz 输出一个点文件,或 igraph 的图形格式或数据框或hash 以便使用绘制表格的函数以及它们之间的连接使用网格或图表。

如果您将它们组合成一个数据框,子集和合并将很有用。

第 4 步

此步骤也可以通过多种不同方式完成。这些包括但不限于

    grid-package(参见参考文献中的 pdf,例如与您请求的用例相匹配的文章),低级图形原语 diagram package 和 shape package(请参阅参考资料中的 pdf 以获取使用示例)稍微高级一点的图形基元 Rgraphviz package(Graphviz,基本上要么生成点文件第 3 步,要么查看参考资料中的 pdf 以获取更多信息) igraph package(只会为每个列和表格组合生成扁平圆圈) CityPlot package(生成实体关系图而不是数据库表图,但可能满足您的需求,需要第 3 步从数据帧生成 csv 文件)

如果使用图表、形状或网格包,您将遍历表列表、散列或其他数据结构,并在每个表上应用一个绘图函数,然后为每个表应用一个单独的函数约束来绘制线条。

参考文献

R an PostgreSQL using RPostgreSQL and sqldf Youtube video Example: PostgreSQL Connection to R Drawing Diagrams with R R Package diagram: visualising simple graphs,flowcharts, and webs Example RPostgreSQL usage Dot Guide For Graphviz How To Plot A Graph Using Rgraphviz

【讨论】:

感谢您提供详细示例。我正在寻找一些节省时间的解决方案。至于现在我使用的 schemacrawler 也使用了 graphviz。它为 javascript、Groovy、Ruby 或 Python 提供脚本支持,但不支持 R。但仍然可以通过命令行调用从 R 中使用。 Schemaspy 是一种节省时间的解决方案,正如前面的 cmets 中所提到的。与此最接近的已经开发的东西是 db.r,但它是为数据模式探索而设计的,而不是大规模导出和 CityPlot,但它仍然需要一个 csv 文件作为数据源才能生成图表。

以上是关于从 Postgresql 表中绘制表和关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中获得随机笛卡尔积?

SQL - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)

从表和参考表中选择列、count(id)

Postgresql以存储在表中的类型返回变量

用于获取存储在单个表中的 n 级父子关系的 Postgresql 查询

如何备份一些带有数据的表和一些表只有模式 PostgreSQL