Свяжите переменные в R DBI

В R DBI пакет, я не нахожу средство для использования связанных переменных. Я действительно находил документ (исходная виньетка с 2002), который говорит о связанных переменных, "Возможно, DBI мог в какой-то момент в будущем реализовать эту опцию", но это похоже до сих пор, что это оставило отмененным.

Что делает люди в R используют для замены? Просто свяжите строки прямо в SQL? Это имеет некоторые очевидные проблемы для безопасности и производительности.

Править:

Вот пример того, как могли работать заполнители:

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

Это не очень хорошо продуманный интерфейс, но идея состоит в том, что можно использовать значение для bind и драйвер обрабатывает детали выхода (если базовый API не обрабатывает связанные переменные исходно) без вызывающей стороны, имеющей необходимость повторно реализовать это [плохо].

10
задан Ken Williams 2 February 2010 в 22:19
поделиться

2 ответа

В startFile () замените $ _ FILES [$ file] на $ file . Вы индексируете массив $ _ FILES дважды.

-121--2856386-

Не забывайте, что большинство людей считают XML сериализованным как текст. Вместо этого его можно сериализовать в двоичный. Это то, что делает netStartBinding и другие такие привязки в WCF. XML-инфо-набор выводится как двоичный, а не как текст. Это все еще XML, только в двоичном формате.

-121--4690768-

Эй эй - я только что обнаружил, что 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, чтобы все БД могли воспользоваться его преимуществами, и обеспечить реализацию по умолчанию, которая просто вставляет его в последовательность, как мы все делаем сами сейчас.

1
ответ дан 3 December 2019 в 18:33
поделиться

Ниже приводится краткое описание того, что в настоящее время поддерживается в 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)
3
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: