2013-11-25 3 views
8

Я пытаюсь вставить данные в ранее существовавшую таблицу PostgreSQL с помощью RPostgreSQL, и я не могу понять синтаксис параметров SQL (подготовленные операторы).Как использовать параметры с RPostgreSQL (для вставки данных)

E.g. Предположим, что я хочу сделать следующее

insert into mytable (a,b,c) values ($1,$2,$3)

Как задать параметры? dbSendQuery, похоже, не понимает, если вы просто поместите параметры в ....

Я нашел, что dbWriteTable может использоваться для сброса всей таблицы, но не позволит вам указывать столбцы (поэтому не подходит для значений по умолчанию и т. Д.). И вообще, мне нужно знать это для других запросов, как только я получу данные там (так что я полагаю, что это не очень специфично).

Конечно, я просто отсутствует что-то очевидное ...

+1

[ли этот ответ помощь] [1]? Вопрос, похоже, похож на вопрос, который там задан. [1]: http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi –

+1

@JoeLove Я думаю (но я не уверен на 100%), что, специфичные для RSQLite , – joran

+0

@joran, да, это натолкнулось неправильно (удалило его). Я имел в виду обратное: R - это язык статистики, было бы неправильно расстраиваться, что функциональность db слаба по сравнению с языком общего назначения. Так же, как вы не ожидали бы glm в C#. Как и в: это не ошибка R, я использую неправильный инструмент для работы. – Corone

ответ

6

Я искал то же самое, по тем же причинам, что является безопасность.

По-видимому, пакет dplyr обладает способностью вас заинтересовать. Он едва документирован, но он есть. Прокрутите вниз до «Postgresql» в этой виньете: http://cran.r-project.org/web/packages/dplyr/vignettes/databases.html

Чтобы суммировать, dplyr предлагает функции sql() и escape(), которые могут быть объединены для создания параметризованного запроса. Функция SQL() из пакета DBI работает точно так же.

> sql(paste0('SELECT * FROM blaah WHERE id = ', escape('random "\'stuff'))) 
<SQL> SELECT * FROM blaah WHERE id = 'random "''stuff' 

Он возвращает объект класса «SQL» и «характер», так что вы можете либо передать его на ТПС() или, возможно, dbSendQuery(), а также.

побег() функция корректно обрабатывает векторы, а также, которые я считаю наиболее полезным:

> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(1:5))) 
<SQL> SELECT * FROM blaah WHERE id in (1, 2, 3, 4, 5) 

То же, естественно, работает с переменными, а также:

> tmp <- c("asd", 2, date()) 
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(tmp))) 
<SQL> SELECT * FROM blaah WHERE id in ('asd', '2', 'Tue Nov 18 15:19:08 2014') 

Я чувствую себя намного безопаснее в настоящее время положить вместе запросы.

+2

Вы также можете использовать новый https://github.com/rstats-db/RPostgres, который имеет полную поддержку параметризованных запросов. – hadley

+0

Спасибо @hadley. Есть примеры на параметризованной части?Несколько дней назад я написал сообщение в блоге (http://welcome-to-data-science.blogspot.com/2015/02/how-to-manage-large-amount-of-data-with.html) о производительности больших вставок, и я хотел бы сделать сравнение между пакетами. – LauriK

+1

Пока нет, но я работаю над сообщением блога для блога Rstudio на следующей неделе. Обратите внимание, что параметризованные вставки для Postgres медленны, поэтому dbWriteTable в RPostgres использует другую стратегию (LOAD INFILE) – hadley

1

В последней RPostgreSQL он должен работать:

db_connection <- dbConnect(dbDriver("PostgreSQL"), dbname = database_name, 
        host = "localhost", port = database_port, password=database_user_password, 
        user = database_user) 
qry = "insert into mytable (a,b,c) values ($1,$2,$3)" 
dbSendQuery(db_connection, qry, c(1, "some string", "some string with | ' ")) 
+0

Я не могу получить похожее на работу, по крайней мере, с 'dbGetQuery'. Не могли бы вы предоставить более подробный источник? – Pranasas

Смежные вопросы