2010-02-02 14 views
8

में बाइंड वैरिएबल आर के DBI पैकेज में, मुझे बाध्य चर का उपयोग करने की सुविधा नहीं मिल रही है। मुझे एक दस्तावेज (2002 से मूल विग्नेट) मिला जो कि बाध्य चर के बारे में कहता है, "शायद भविष्य में डीबीआई भविष्य में इस बिंदु को लागू कर सकता है", लेकिन ऐसा लगता है कि अब तक पूर्ववत हो गया है।आर डीबीआई

आर में लोगों के लिए एक विकल्प के लिए क्या उपयोग करते हैं? एसक्यूएल में स्ट्रिंग्स को बस संयोजित करें? सुरक्षा & प्रदर्शन के लिए कुछ स्पष्ट समस्याएं हैं।

संपादित करें:

यहाँ कैसे प्लेसहोल्डर काम कर सकता का एक उदाहरण है:

query <- "SELECT numlegs FROM animals WHERE color=?" 
result <- dbGetQuery(caseinfo, query, bind="green") 

एक बहुत अच्छी तरह से विचार कर निकाली इंटरफेस नहीं है यही कारण है कि, लेकिन यह विचार है कि आप bind के लिए एक मूल्य का उपयोग कर सकते है और चालक को बचने के बिना कॉलर के बिना बचने के विवरण (अगर अंतर्निहित एपीआई बाध्य चर को संभाल नहीं करता है) का विवरण संभालता है।

+0

क्या आप कुछ उदाहरण कोड प्रदान कर सकते हैं जो आप इसे संचालित करना चाहते हैं? बाध्य चर के लिए आप किस व्यवहार की अपेक्षा करेंगे? –

+0

क्या आपका मतलब कुछ ऐसा है? http://stackoverflow.com/questions/2182337/how-to-use-a-variable-name-in-a-mysql-statement –

+1

मैं बेहतर सुविधाओं के साथ एक नई डीबीआई गंध करता हूं। हम सभी बीटा टेस्टर्स, केन खुश होंगे .... –

उत्तर

16

किसी के लिए: मैं वास्तव में मेरे सारे Git का उपयोग कर विकास करते हैं और इसलिए सबसे अच्छा मामले कहना RSQLite की एक Git क्लोन बनाने और उसके बाद के रूप में मुझे git format-patch -n git-svn..

किसी भी तरह डिफ भेजने के लिए है, यहाँ कुछ उदाहरण हैं इस सवाल पर आ रहा है जैसे कि मैंने rsqlite और dbgetpreparedquery के लिए googling के बाद किया था, ऐसा लगता है कि rsqlite के नवीनतम संस्करण में आप बाध्य चर के साथ एक SELECT क्वेरी चला सकते हैं।

query <- "SELECT probe_type,next_base,color_channel FROM probes WHERE probeid=?" 
probe.types.df <- dbGetPreparedQuery(con,que,bind.data=data.frame(probeids=ids)) 

यह अपेक्षाकृत तेज था (एक 450,000 पंक्ति तालिका से बाहर 2,000 पंक्तियों का चयन) और अविश्वसनीय रूप से उपयोगी है: मैं बस निम्नलिखित भाग गया।

एफवाईआई।

+0

मैं अस्पष्ट हूं कि dbgetpreparedquery और dbsendpreparedquery – Carbon

+1

के बीच अंतर क्या है, जैसा कि मैं इसे समझता हूं, 'GetQuery' फ़ंक्शंस डेटाफ्रेम के रूप में परिणाम लौटाता है, जबकि' SendQuery' फ़ंक्शंस एक कर्सर लौटाता है जिससे आप बैच में परिणामों का अनुरोध कर सकते हैं ' fetch' विधि। RSQLITE :: क्वेरी http://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf के लिए प्रलेखन देखें –

1

अरे अरे - मैं सिर्फ पता चला कि RSQLite है, जो कि मैं क्या इस मामले में उपयोग कर रहा हूँ है, करता है वास्तव में बाध्य-चर समर्थन किया है:

http://cran.r-project.org/web/packages/RSQLite/NEWS

प्रवेश के बारे में dbSendPreparedQuery() और dbGetPreparedQuery() देखें।

df <- data.frame() 
for (x in data$guid) { 
    query <- paste("SELECT uuid, cites, score FROM mytab WHERE uuid='", 
       x, "'", sep="") 
    df <- rbind(df, dbGetQuery(con, query)) 
} 
इस में

:

df <- dbGetPreparedQuery(
    con, "SELECT uuid, cites, score FROM mytab WHERE uuid=:guid", data) 

दुर्भाग्य से, जब मैं वास्तव में यह कोशिश करते हैं, ऐसा लगता है कि यह केवल INSERT बयानों और तरह के लिए है,

तो सिद्धांत रूप में, यह है कि इस गंदगी में बदल जाता है SELECT कथन के लिए नहीं, क्योंकि मुझे एक त्रुटि मिलती है: RS-DBI driver: (cannot have bound parameters on a SELECT statement)

यह प्रदान करना कि क्षमता शानदार होगी।

अगला कदम इसे डीबीआई में ही उड़ाएगा ताकि सभी डीबी इसका लाभ उठा सकें और एक डिफ़ॉल्ट कार्यान्वयन प्रदान कर सकें जो इसे स्ट्रिंग में चिपकाता है जैसे कि हम सब अब खुद कर रहे हैं।

3

नीचे वर्तमान में RSQLite में पैरामीटर के लिए समर्थित है का सारांश है। आप सही हैं कि वर्तमान में चयन के लिए समर्थन नहीं है, लेकिन इसके लिए कोई अच्छा कारण नहीं है और मैं इसके लिए समर्थन जोड़ना चाहता हूं।

use --user=readonly --password=readonly 

https://hedgehog.fhcrc.org/compbio/r-dbi/trunk 
https://hedgehog.fhcrc.org/compbio/r-dbi/trunk/DBI 
https://hedgehog.fhcrc.org/compbio/r-dbi/trunk/SQLite/RSQLite 

मैं पैच प्राप्त करने के लिए, खासकर अगर वे परीक्षण और दस्तावेज शामिल चाहते:

आप हैकिंग की तरह महसूस करते हैं, तो आप के सभी यहाँ DBI संबंधित संकुल की केवल पढ़ने के लिए चेकआउट मिल सकती है। एकीकृत अंतर, कृपया।

library("RSQLite") 

make_data <- function(n) 
{ 
    alpha <- c(letters, as.character(0:9)) 
    make_key <- function(n) 
    { 
     paste(sample(alpha, n, replace = TRUE), collapse = "") 
    } 
    keys <- sapply(sample(1:5, replace=TRUE), function(x) make_key(x)) 
    counts <- sample(seq_len(1e4), n, replace = TRUE) 
    data.frame(key = keys, count = counts, stringsAsFactors = FALSE) 
} 

key_counts <- make_data(100) 


db <- dbConnect(SQLite(), dbname = ":memory:") 

sql <- " 
create table keys (key text, count integer) 
" 

dbGetQuery(db, sql) 

bulk_insert <- function(sql, key_counts) 
{ 
    dbBeginTransaction(db) 
    dbGetPreparedQuery(db, sql, bind.data = key_counts) 
    dbCommit(db) 
    dbGetQuery(db, "select count(*) from keys")[[1]] 
} 

## for all styles, you can have up to 999 parameters 

## anonymous 
sql <- "insert into keys values (?, ?)" 
bulk_insert(sql, key_counts) 


## named w/ :, $, @ 
## names are matched against column names of bind.data 

sql <- "insert into keys values (:key, :count)" 
bulk_insert(sql, key_counts[ , 2:1]) 

sql <- "insert into keys values ($key, $count)" 
bulk_insert(sql, key_counts) 

sql <- "insert into keys values (@key, @count)" 
bulk_insert(sql, key_counts) 

## indexed (NOT CURRENTLY SUPPORTED) 
## sql <- "insert into keys values (?1, ?2)" 
## bulk_insert(sql)