В R DBI
пакет, я не нахожу средство для использования связанных переменных. Я действительно находил документ (исходная виньетка с 2002), который говорит о связанных переменных, "Возможно, DBI мог в какой-то момент в будущем реализовать эту опцию", но это похоже до сих пор, что это оставило отмененным.
Что делает люди в R используют для замены? Просто свяжите строки прямо в SQL? Это имеет некоторые очевидные проблемы для безопасности и производительности.
Править:
Вот пример того, как могли работать заполнители:
query <- "SELECT numlegs FROM animals WHERE color=?"
result <- dbGetQuery(caseinfo, query, bind="green")
Это не очень хорошо продуманный интерфейс, но идея состоит в том, что можно использовать значение для bind
и драйвер обрабатывает детали выхода (если базовый API не обрабатывает связанные переменные исходно) без вызывающей стороны, имеющей необходимость повторно реализовать это [плохо].
В startFile ()
замените $ _ FILES [$ file]
на $ file
. Вы индексируете массив $ _ FILES
дважды.
Не забывайте, что большинство людей считают XML сериализованным как текст. Вместо этого его можно сериализовать в двоичный. Это то, что делает netStartBinding
и другие такие привязки в WCF. XML-инфо-набор выводится как двоичный, а не как текст. Это все еще XML, только в двоичном формате.
Эй эй - я только что обнаружил, что RSQLite, который я использую в данном случае, действительно имеет поддержку связанных переменных:
http://cran.r-project.org/web/packages/RSQLite/NEWS
См. запись о dbSendRequery Query ()
и dbGetTachQuery ()
.
Итак, теоретически, это превращает эту гнусность:
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 драйвер: (не может иметь связанных параметров для инструкции SELECT)
Предоставление этой возможности было бы фантастическим.
Следующим шагом будет погрузить его в сам DBI, чтобы все БД могли воспользоваться его преимуществами, и обеспечить реализацию по умолчанию, которая просто вставляет его в последовательность, как мы все делаем сами сейчас.
Ниже приводится краткое описание того, что в настоящее время поддерживается в RSQLite для связанных параметров. Вы правы, что в настоящее время нет поддержки для SELECT, но для этого нет веских причин, и я хотел бы добавить поддержку для этого.
Если вам захочется поработать, вы можете получить доступ к проверке всех пакетов, связанных с DBI, только для чтения. пакетов, связанных с DBI, здесь:
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
Мне нравится получать патчи, особенно если они включают тесты и документацию.
документацию. Унифицированный diff, пожалуйста. На самом деле я делаю все свои
разработки, используя git, и поэтому лучший вариант - создать git-клон, скажем, RSQLite и затем присылать мне различия.
RSQLite и затем посылать мне диффы как git format-patch -n
git-svn...
Так или иначе, вот несколько примеров:
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)