2016-07-22 4 views
2

나는 mysql에서 수백 개의 데이터베이스를 r 개로 분리하고 싶다. 나는 그것들을 개별적으로 얻을 수는 있지만, 루프/함수를 만드는 법을 모르고서 모든 것을 한꺼번에 처리 할 수는 없다.r에 모든 mysql 데이터베이스를 가져 오는 방법

다음은 별도로 가져 오는 방법입니다.

library(RMySQL) 
mydb = dbConnect(MySQL(), user='root', password='nelson', host='localhost', dbname="bookstore")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
dub4_4_16 <- dbSendQuery(mydb, "select * from dub") 
dub4_4_16 = fetch(dub4_4_16, n=-1) 

reg4_4_16 <- dbSendQuery(mydb, "select * from all_sorted") 
reg4_4_16 = fetch(reg4_4_16, n=-1) 

dub4_5_16 <- dbSendQuery(mydb, "select * from dub4_5") 
dub4_5_16 = fetch(dub4_5_16, n=-1) 

답변

3

은 내가 RMySQL 환경에서 작동하도록합니다 (tcpl 패키지에서 가져온 기능에 따라) 아래에있는 것과 같은 기능의 목록을 사용합니다. 함수는 DBI 호출에 대한 래퍼 일뿐입니다. 이것은 매우 긴 대답이지만, 접근법의 요지는 쿼리 문자열을 생성하는 것입니다. 쿼리를 통해 데이터를로드합니다. 결과 (results)는 연결에있는 각 데이터베이스의 각 테이블을 포함하는 data.table 개체 목록을 제공합니다.

library(data.table) 
library(RMySQL) 

##----------------------------------------------------------------------------## 
## Accessory functions 
##----------------------------------------------------------------------------## 

getQuery <- function(query, db, user = "dayne", 
        pass = "password", host = "localhost") { 
    ## Change the default values as necessary, or just pass your values 
    ## each time the function is called. Check out the original to see 
    ## how it finds global variables set by the package. 

    dbcon <- dbConnect(drv = RMySQL::MySQL(), 
        user = user, 
        password = pass, 
        host = host, 
        dbname = db) 
    result <- dbGetQuery(dbcon, query) 
    dbDisconnect(dbcon) 
    result <- as.data.table(result) 
    result[] 

} 

sendQuery <- function(query, db = "", user = "dayne", 
        pass = "password", host = "localhost") { 

    dbcon <- dbConnect(drv = RMySQL::MySQL(), 
        user = user, 
        password = pass, 
        host = host, 
        dbname = db) 
    temp <- try(dbSendQuery(dbcon, query), silent = TRUE) 
    if (!is(temp, "try-error")) dbClearResult(temp) 
    dbDisconnect(dbcon) 

    if (!is(temp, "try-error")) return(TRUE) 

    temp[1] 

} 

appendTable <- function(dat, tbl, db, user = "dayne", 
         pass = "password", host = "localhost") { 

    dbcon <- dbConnect(drv = RMySQL::MySQL(), 
        user = user, 
        password = pass, 
        host = host, 
        dbname = db) 
    dbWriteTable(conn = dbcon, 
       name = tbl, 
       value = dat, 
       row.names = FALSE, 
       append = TRUE) 

    dbDisconnect(dbcon) 

    return(TRUE) 

} 

##----------------------------------------------------------------------------## 
## Create example data 
##----------------------------------------------------------------------------## 

listofdb <- c("db1", "db2", "db3") 
q1 <- paste0("CREATE DATABASE ", listofdb, ";") 
sapply(q1, sendQuery) 
listoftables <- paste0("tb", 1:5) 
q2fmt <- "CREATE TABLE %s (val DOUBLE)" 
q2 <- sprintf(q2fmt, listoftables) 
createtables <- function(db) { 
    sapply(q2, sendQuery, db = db) 
    sapply(listoftables, 
     appendTable, 
     db = db, 
     dat = data.table(val = rnorm(10))) 
} 
sapply(listofdb, create tables) 


##----------------------------------------------------------------------------## 
## Do the work 
##----------------------------------------------------------------------------## 

## Load all of the tables form different databases 
my_db_list <- getQuery("SHOW DATABASES;", db = "")$Database 
my_db_list 
# [1] "db1" "db2" "db3" 

table_list <- lapply(my_db_list, getQuery, query = "SHOW TABLES;") 
names(table_list) <- my_db_list 
table_list 
# $db1 
# Tables_in_db1 
# 1:   tb1 
# 2:   tb2 
# 3:   tb3 
# 4:   tb4 
# 5:   tb5 
# 
# $db2 
# Tables_in_db2 
# 1:   tb1 
# 2:   tb2 
# 3:   tb3 
# 4:   tb4 
# 5:   tb5 
# 
# $db3 
# Tables_in_db3 
# 1:   tb1 
# 2:   tb2 
# 3:   tb3 
# 4:   tb4 
# 5:   tb5 

## The db name to the table_list data.tables and collapse 
table_list <- lapply(names(table_list), 
        function(x) table_list[[x]][ , db := x]) 
table_list <- rbindlist(table_list) 
setnames(table_list, c("tbl", "db")) 

## Load all tables from all databases 
table_list[ , full_name := paste(db, tbl, sep = ".")] 
get_tables <-paste0("SELECT * FROM ", table_list$full_name, ";") 
results <- lapply(get_tables, getQuery, db = "") 
names(results) <- table_list$full_name 

results[["db1.tb5"]] 
#   val 
# 1: -0.09380952 
# 2: 0.81556657 
# 3: 1.18589086 
# 4: 0.19746379 
# 5: 0.91738280 
# 6: 1.30142674 
# 7: 1.42089957 
# 8: -0.16475130 
# 9: 0.40345353 
# 10: -1.31012033 

##----------------------------------------------------------------------------## 
## Remove example data 
##----------------------------------------------------------------------------## 

cleanup <- paste0("DROP DATABASE ", listofdb, ";") 
sapply(cleanup, sendQuery) 
관련 문제