2016-10-22 14 views
0

特定のデータベースにmysqlテーブルが存在するかどうかをShinyアプリで確認したいのですが、テーブルが存在しない場合、null値が返されます。私のコードは次のようになっています。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) 

} 

私はsome_tableがdatabseに存在しない場合dbSendQuery(db, "SELECT * FROM some_table")によってスローされた例外を処理します。 助けてください。

+0

[Rでの例外処理]の可能な複製(http://stackoverflow.com/questions/2622777/exception-handling-in-r) –

+0

チェックの価値があります:http://stackoverflow.com/documentation/r/4060 /フォールト・トレラント・レジリエンス・コード/ 14150/use-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の2番目の引数にpaste0()することができます。 –

+0

@ MarkMillerありがとう。それは驚くほど働いた.. – Neil

1

テーブルが存在しない場合、これはnullを返します。

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

あなたはテーブルが存在するかどうかで場合にのみ関心がある場合はまた、INCLUDEとTABLE_SCHEMA =「あなたのスキーマ」したい場合があります1つの特定のスキーマ

+0

ベスト答え;短いと甘い。 – jogall

関連する問題