【问题标题】:RMySQL - automating reading data from DB tablesRMySQL - 自动从数据库表中读取数据
【发布时间】:2020-03-13 18:40:39
【问题描述】:

我有一段代码:

mydb <- dbConnect(MySQL(), user = "****", password = "****", dbname = "c_global", host = "")

df_ipt_rate_history   <- fetch(dbSendQuery(mydb, "select * from ipt_rate_history"), n=-1)
df_map_occupation     <- fetch(dbSendQuery(mydb, "select * from map_occupation"), n=-1)
df_map_titles         <- fetch(dbSendQuery(mydb, "select * from map_titles"), n=-1)
df_pcode_full_areas   <- fetch(dbSendQuery(mydb, "select * from pcode_full_areas"), n=-1)
df_pcode_rics_regions <- fetch(dbSendQuery(mydb, "select * from pcode_rics_regions"), n=-1)
df_pcode_sector_areas <- fetch(dbSendQuery(mydb, "select * from pcode_sector_areas"), n=-1)

...等等(多个表)

dbDisconnect(mydb)

它工作正常,但有没有办法设置某种循环,在单个命令中读取数据库中的每个表(并输出到数据帧)?

谢谢

【问题讨论】:

    标签: mysql r rmysql


    【解决方案1】:

    您可以使用dbListTables 列出数据库中的所有表,然后使用实用函数dbReadTable 读取它们的所有行和列。

    all_data <- lapply(dbListTables(mydb), dbReadTable, conn = mydb)
    

    顺便说一句,除非必要,否则如果可以在需要时从数据库中读取所有数据,则将所有数据加载到内存中可能不是一个好主意。

    【讨论】:

      【解决方案2】:

      假设每个表的结构不同,一种选择是使用lapplypurrr::map 获取每个数据帧并将它们存储在一个列表中。

      在基础 R 中:

      mydb <- dbConnect(MySQL(), user = "****", password = "****", dbname = "c_global", host = "")
      
      table_names <- c("ipt_rate_history",
                       "map_titles",
                       "pcode_full_areas",
                       "pcode_rics_regions",
                       "pcode_sector_areas")
      
      df <- lapply(table_names, 
                   function(x) fetch(dbSendQuery(mydb, paste("select * from", x), n = -1)))
      
      df <- setNames(df, table_names)
      

      使用purrr 包:

      table_names <- c("ipt_rate_history",
                       "map_titles",
                       "pcode_full_areas",
                       "pcode_rics_regions",
                       "pcode_sector_areas")
      
      df <- purrr::map(table_names, 
                       ~fetch(dbSendQuery(mydb, paste("select * from", .), n = -1)))
      
      df <- purrr::set_names(df, table_names)
      

      然后您可以使用df$table_name 访问每个表,例如 df$ipt_rate_history

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 2018-03-21
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        相关资源
        最近更新 更多