关于sql:从Postgresql表中绘制表和关系

Plot tables and relationships from Postgresql tables

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

enter image description here


是的,这是可能的。好的。

至于如何实现,请参见以下步骤好的。

步骤好的。

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

    对于从R连接到PostgreSQL数据库,有多种机制可以做到这一点,包括好的。

  • r postgresql(r到postgresql,持久连接)
  • sqldf(r到postgresql,临时连接自动执行步骤3的一部分),它有r postgresql作为依赖项。
  • pl/r(PostgreSQL到r)
  • db.r(r到postgresql,内置基本数据库可视化,例如部分步骤2、3、4)
  • rpostgresql中步骤1的示例如下:好的。

    1
    2
    3
    4
    5
    6
    7
    library(RPostgreSQL)

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

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

    步骤2好的。

    这可以通过几种方式实现。它可以直接在SQL中完成,也可以使用好的。

    rpostgresql的dblisttables和dblistfields或两者的组合。好的。

    例如,要查询数据库中的所有表、表中的所有字段/列或表中的所有约束,请参阅以下stackoverflow答案好的。

    • PostgreSQL描述表
    • 在PostgreSQL中显示表
    • 列出PostgreSQL信息模式中的所有表
    • 如何列出指定表DBA StackExchange的所有列
    • PostgreSQL将列出外键(只需从WHERE子句中删除或修改约束类型以获取外键和主键)

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

    这里的步骤是好的。

  • 获取表列表
  • 遍历表列表并为每个表获取列(或者,只使用包含表名和结果集中列名的查询查询所有列)
  • 遍历表列表并交替获取每个表的约束,只需使用包含表名和结果集中约束名的查询查询所有列)
  • rpostgresql中步骤2的示例如下:好的。

    调整您的SQL以适应。好的。

    第一部分好的。

    用于获取表列表好的。

    使用内置功能好的。

    1
    tables1 <- dbListTables(con)

    使用SQL好的。

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

    第2部分好的。

    使用内置功能好的。

    您将使用dblistfields(con,"tablename"),并将其应用于表的前一个数据帧。请参阅如何将函数应用于r中矩阵(或数据帧)的每一行,或将函数应用于r中数据帧的每一行,并将结果保存到变量。好的。

    使用SQL好的。

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

    第3部分好的。

    使用SQL好的。

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

    步骤3好的。

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

    您要么需要为cityplot输出一个csv文件,要么需要为graphviz输出一个点文件,要么输出igraph的图形格式,要么输出一个数据帧或哈希,以便使用使用使用网格或图表绘制表和表间连接的函数进行处理。好的。

    如果要将它们组合到单个数据帧中,那么子集和合并将非常有用。好的。

    步骤4好的。

    这个步骤也可以用许多不同的方法来完成。这些包括但不限于好的。

  • 网格包(参见参考资料中的pdf,例如与您请求的用例相匹配的文章),低级图形原语
  • 图表包和形状包(使用示例请参见参考资料中的pdf)稍高级别的图形原语
  • rgraphviz包(graphviz,基本上要么生成点文件步骤3,要么参见参考文献中的pdf了解更多信息)
  • IGraph包(只会为每个列和表组合生成扁平的圆形)
  • cityplot包(生成实体关系图,而不是数据库表图,但可能满足您的需要,需要步骤3从数据帧生成csv文件)
  • 如果使用图表、形状或网格包,您将遍历表列表、哈希或其他数据结构,并对每个表应用一个draw函数,然后为每个约束应用一个单独的函数来绘制行。好的。

    工具书类好的。

    • r使用r postgresql和sqldf的postgresql
    • YouTube视频示例:PostgreSQL连接到R
    • 带R的绘图图
    • R包图:可视化简单的图、流程图和Web
    • rpostgresql用法示例
    • 石墨带的点指南
    • 如何使用rgraphviz绘制图形

    好啊。