是否可以使用 R 绘制 postgresql 数据库中的表及其关系,如下所示?
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 查询数据库中的所有表,或表中的所有字段/列或表中的所有约束,请参阅以下 StackOverflow 答案
- PostgreSQL 描述表
- 在 PostgreSQL 中显示表
- 列出 PostgreSQL 信息模式中的所有表
- 如何列出指定表 DBA StackExchange 的所有列
- PostgreSQL 列出外键(您只需从 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"),并应用于表的前一个数据框。了解如何将函数应用于 R 中矩阵(或数据框)的每一行或将函数应用于 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 的图形格式或数据框或哈希输出,以便使用使用网格或图表绘制表格和它们之间的连接的函数进行处理。
如果您将它们组合成一个数据框,则子集和合并将很有用。
第4步
这个步骤也可以通过许多不同的方式来完成。这些包括但不限于
- 网格包(参见参考资料中的 pdf,例如与您请求的用例相匹配的文章),低级图形原语
- diagram package和shape package
- Rgraphviz 包(Graphviz,基本上要么生成点文件第 3 步,要么查看参考资料中的 pdf 以获取更多信息)
- igraph 包(只会为每个列和表格组合生成扁平的圆圈)
- CityPlot 包(生成实体关系图而不是数据库表图,但可能满足您的需求,需要第 3 步从数据框生成 csv 文件)
如果使用图表、形状或网格包,您将遍历表列表、散列或其他数据结构,并在每个表上应用一个绘制函数,然后为每个约束应用一个单独的函数来绘制线条。
参考