RMySQL - автоматизация чтения данных из таблиц БД

У меня есть кусок кода таким образом:

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)

Он отлично работает, но есть ли способ настроить какой-то цикл, который считывает каждую таблицу в БД (и выводит во фрейм данных) в одной команде?

Спасибо


person Alan    schedule 18.11.2019    source источник


Ответы (2)


Вы можете использовать dbListTables для перечисления всех ваших таблиц в вашей базе данных, а затем прочитать все их строки и столбцы с помощью служебной функции dbReadTable.

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

Кстати, если в этом нет необходимости, возможно, не стоит загружать в память все данные, если при необходимости их можно прочитать из базы данных.

person odessa    schedule 18.11.2019

Предполагая, что каждая таблица находится в другой структуре, одним из вариантов было бы использовать lapply или purrr::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.

person Gabriel Silva    schedule 18.11.2019