2012-01-27 60 views
2

我在R中有一個向量值,並想從sqlite數據庫獲得響應值。我使用下面的代碼。用R向量查詢sqlite數據庫的有效方法

values = c() 

for (a in keys) 
{ 
    result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a) 
    values = c(values,results) 
} 

不幸的是,這個代碼是非常緩慢的。有沒有更好的方法來做到這一點?

感謝,

約翰內斯

+0

我可能會將您的SQL查詢從'Id ='更改爲'Id IN(...)'。 「鍵」字符,數字,......中的值? – joran 2012-01-28 00:20:05

+0

他們是字符。您是否建議在IN之後將整個矢量放入括號中?那會保留正確的順序嗎? – 2012-01-28 01:07:00

+0

可能不是(它將取決於按鍵的順序)。我會在查詢中選擇'content'和'Id',然後對結果進行排序,無論是在SQLite中,還是在R中的事實之後進行排序。 – joran 2012-01-28 01:10:05

回答

2

如果aacontent不是非常大,那麼讀取所有到R和使用的東西,如R的匹​​配功能,或sqldf功能,或data.table功能

如果aacontent對於那個來說太大了,而且鍵是small-ish,那麼把鍵寫入一個sqlite表並且執行連接查詢。您可以從其中一個或兩個創建索引中受益。

+0

謝謝,編寫關鍵字並執行連接查詢極其有用。 – 2012-02-19 04:01:37

0

的肯定是預先構建工具,SQL與R查詢類似這樣的任務(因爲你使用SQLite,我一定要看看sqldf),但在我的經驗,我剛寫出來很多用於構建查詢的小幫助包裝函數。

例如,在你的情況下,你的問題不是真正的R部分,而是你想將keys中的所有值放入一個查詢中。所以,你想要一個查詢,看起來更像是:

SELECT content FROM aacontent WHERE Id IN (val1,val2,...) 

,然後訣竅是R中使用paste打造IN條款。我傾向於在dbGetQuery上使用一個簡單的包裝函數,它使用...參數和paste將各種查詢拼湊在一起。事情是這樣的:

myQuery <- function(con,...){ 
    arg <- list(...) 
    res <- dbGetQuery(con,paste(arg,collapse = "")) 
    res 
} 

所以,這是一個有點容易縫合在一起的東西用IN條款時:

myQuery(con,"SELECT content FROM aacontent WHERE Id IN (", 
      paste(keys,collapse = ","),")) 

請注意,這是一個有點困難,如果在keys值是人物,從此你需要與paste做更多的工作來獲得每個元素的單引號,但這不是那麼多的工作。

如果所討論的數據庫相當小,這個建議更加相關;如果你處理更大的數據,Spacedman的建議可能更值得關注。

+0

http://xkcd.com/327/適用於此。 – Spacedman 2012-01-28 09:10:59

+0

@Spacedman取決於設置的細節。在我的情況下,我的數據庫只能被身邊的人查詢,所以我傾向於不擔心這樣的事情,因爲如果某個人真的有我的電腦,我就會遇到比SQL注入攻擊更大的問題。 – joran 2012-01-28 10:12:44

+0

是的,但它不只是你不必擔心的惡意攻擊。一旦你開始構建字符串傳遞給SQL表達式,你不得不擔心引號和分號等等。 R的DB包中是否有sql轉義函數或佔位符替換技術? – Spacedman 2012-01-28 11:59:44