RMySQL - 自动从数据库表中读取数据
RMySQL - automating reading data from DB tables
我有这样一段代码:
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)
...等等(多个tables)
dbDisconnect(mydb)
它工作正常,但有没有办法设置某种循环,在单个命令中读取数据库中的每个 table(并输出到数据帧)?
谢谢
假设每个 table 都在不同的结构中,一种选择是使用 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
、 访问每个 table,例如 df$ipt_rate_history
.
您可以使用 dbListTables
列出数据库中的所有表,然后使用实用函数 dbReadTable
.
读取它们的所有行和列
all_data <- lapply(dbListTables(mydb), dbReadTable, conn = mydb)
顺便说一句,除非有必要,如果需要时可以从数据库中读取数据,则将所有数据加载到内存中可能不是一个好主意。
我有这样一段代码:
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)
...等等(多个tables)
dbDisconnect(mydb)
它工作正常,但有没有办法设置某种循环,在单个命令中读取数据库中的每个 table(并输出到数据帧)?
谢谢
假设每个 table 都在不同的结构中,一种选择是使用 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
、 访问每个 table,例如 df$ipt_rate_history
.
您可以使用 dbListTables
列出数据库中的所有表,然后使用实用函数 dbReadTable
.
all_data <- lapply(dbListTables(mydb), dbReadTable, conn = mydb)
顺便说一句,除非有必要,如果需要时可以从数据库中读取数据,则将所有数据加载到内存中可能不是一个好主意。