2015-01-07 33 views
2

我對R相當陌生,所以如果這是一個業餘愛好者的問題,請原諒我。我仍然沒有得到R語言如何工作的部分內容,而且我還沒有使用足夠的關閉來真正構建關於如何解決這個問題的直覺。乾淨的方式來包裝和處理RMySQL連接?

我想以一種乾淨的方式打開和關閉我的R項目中的數據庫連接。我有各種各樣的腳本,都使用一個通用的數據庫連接配置文件(我不把它放在我的repo中,它只是一個本地文件),所有這些都需要連接到同一個MySQL數據庫。

的最終目標是做這樣的事情:

​​

這是我寫的,到目前爲止(我所有的腳本加載從另一個.R文件這些功能):

db_open <- function() { 
    db_close() 
    db_conn <<- dbConnect(MySQL(), user = db_user, password = db_pass, host = db_host) 

    query <- function(...) { dbGetQuery(db_conn, ...) } 

    return(query) 
} 

db_close <- function() { 
    result <- tryCatch({ 
    dbDisconnect(db_conn) 
    }, warning = function(w) { 
    # ignore 
    }, error = function(e) { 
    return(FALSE) 
    }) 

    return(result) 
} 

我當我不應該這樣做時,可能會以OOP方式思考這一點,但是將db_conn粘在全球環境中感覺不必要甚至是錯誤的。

這是一個合理的方式來完成我想要的?有沒有更好的方法讓我在這裏失蹤?

任何意見表示讚賞。

+0

現在這是在RMySQL的開發版本自動完成 – hadley

回答

1

你基本上已經擁有了它,你只需要將查詢函數移動到它自己的函數中。關於保持db_conn,真的沒有理由不在全球環境中。

db_open <- function() { 
    db_close() 
    db_conn <<- dbConnect(MySQL(), user='root', password='Use14Characters!', dbname='msdb_complex', host='localhost') 
} 

db_close <- function() { 
    result <- tryCatch({ 
    dbDisconnect(db_conn) 
    }, warning = function(w) { 
    # ignore 
    }, error = function(e) { 
    return(FALSE) 
    }) 

    return(return) 
} 

query <- function(x,num=-1) 
{ 
    q <- dbSendQuery(db_conn, x) 
    s <- fetch(q, num); 
} 

那麼你應該能夠做這樣的事情:

query <- db_open() 
results <- query("SELECT * FROM msenrollmentlog", 10) 
db_close() 
相關問題