2016-10-22 9 views
0

Shiny 앱에서 특정 databse에 mysql 테이블이 존재하는지 여부를 확인하고 싶습니다. 테이블이 존재하지 않으면 널값을 리턴해야합니다. 여기 내 코드가 있습니다.RMysql에 테이블이 있는지 여부를 확인하는 방법

loadData <- function(){ 

db <- dbConnect(MySQL(), dbname = databaseName, host = host, 
       port = port, user = user, password = password) 

res <- dbSendQuery(db, "SELECT * FROM some_table") 
final_data <- dbFetch(res) 
dbDisconnect(db) 
return(final_data) 

} 

나는, 데이타베이스에 존재하지 않는 dbSendQuery(db, "SELECT * FROM some_table")some_table 경우에 의해 throw 예외를 처리합니다. 도와주세요 ..

+0

[R의 예외 처리] 가능한 복제본 (http://stackoverflow.com/questions/2622777/exception-handling-in-r) –

+0

확인할 가치가있는 데이터 : http://stackoverflow.com/documentation/r/4060/내결함성 - 복원 코드/14150/trycatch 사용 # t = 201610221715188281912 –

답변

1

내가하는 일은 다음과 같습니다. 아마 더 강력하거나 일반화 될 수있는 뭔가가 있을까요?

"show tables"를 쿼리로 사용하고 결과에 테이블 이름이 있는지 확인하십시오. 테이블이 존재하지 않는 경우

loadData <- function() { 
    db <- dbConnect(
    MySQL(), 
    dbname = databaseName, 
    host = host, 
    port = port, 
    user = user, 
    password = password 
) 

    rs <- dbSendQuery(con, "show tables") 
    table.frame <- fetch(rs, n = -1) 
    if ("some_table" %in% table.frame[, 1]) { 

    res <- dbSendQuery(db, "SELECT * FROM some_table") 
    final_data <- dbFetch(res) 
    dbDisconnect(db) 
    return(final_data) 

    } else { 
    return(NULL) 
    } 
} 
+1

좋은 것, 당신은 또한 'some_table'과 같은 테이블을 보여줄 수 있고 'some_table'이라는 테이블만으로 결과를 제한 할 수 있습니다. 따라서 쿼리가 행을 반환하면 테이블이 존재 함을 의미합니다. – Jayvee

+1

예, 더 빠르고 효율적입니다. , 그렇지? 쿼리에서 특정 테이블을 하드 코딩하여 수행하거나 테이블을 함수의 매개 변수로 만든 다음 dbSendQuery의 두 번째 인수에 paste0()을 추가 할 수 있습니다. –

+0

@MarkMiller 고마워요. 그것은 굉장했습니다. – Neil

1

이 null을 리턴합니다 :

... 
res <- dbSendQuery(db, "SELECT nullif(count(1),0) tableexists FROM information_schema.tables WHERE table_name='some_table'") 
... 

당신도 포함 TABLE_SCHEMA = '스키마'할 수 있습니다, 테이블이 존재 여부의 경우에만 관심이 있다면 하나의 특정 스키마

+0

우수 답변; 짧고 달다. – jogall