2013-11-25 8 views
8

Sto cercando di inserire dati in una tabella PostgreSQL preesistente utilizzando RPostgreSQL e non riesco a capire la sintassi per i parametri SQL (istruzioni preparate).Come utilizzare i parametri con RPostgreSQL (per inserire dati)

E.g. supponiamo che io voglio fare la seguente

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

Come faccio a specificare i parametri? dbSendQuery non sembra capire se hai appena inserito i parametri nel ....

Ho trovato dbWriteTable può essere utilizzato per scaricare un'intera tabella, ma non consente di specificare le colonne (quindi non va bene per i valori predefiniti, ecc.). E comunque, dovrò sapere questo per altre domande una volta che avrò i dati lì (quindi suppongo che questo non sia veramente specifico)!

Certo mi manca solo una cosa ovvia ...

+1

[Fa questo aiuto risposta] [1]? La domanda sembra essere simile a quella che è stata posta lì. [1]: http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi –

+1

@JoeLove credo (ma non sono sicuro al 100%), che che è specifico per RSQLite . – joran

+0

@joran, sì, che ha sbagliato (cancellato). In un certo senso intendevo il contrario: che R è un linguaggio di statistiche, sarebbe sbagliato sconvolgere il fatto che la funzionalità db sia debole rispetto a un linguaggio generico. Proprio come non ti aspetteresti glm in C#. Come in: non è colpa di R, sto usando lo strumento sbagliato per il lavoro. – Corone

risposta

6

che stavo cercando la stessa cosa, per le stesse ragioni, il che è la sicurezza.

Apparentemente il pacchetto dplyr ha la capacità che ti interessa. È a malapena documentato, ma è lì. Scorrere fino a "Postgresql" in questa vignetta: http://cran.r-project.org/web/packages/dplyr/vignettes/databases.html

Per riepilogare, dplyr offre le funzioni sql() e escape(), che possono essere combinate per produrre una query parametrizzata. La funzione SQL() dal pacchetto DBI sembra funzionare esattamente nello stesso modo.

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

restituisce un oggetto di classi "SQL" e "carattere", quindi è possibile passarlo a TBL() o, eventualmente, dbSendQuery() pure.

La fuga() funzione gestisce correttamente vettori pure, che trovo più utile:

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

Lo stesso, naturalmente, funziona con le variabili così:

> 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') 

mi sento molto più sicuro ora mettendo insieme interrogazioni.

+2

Puoi anche utilizzare il nuovo https://github.com/rstats-db/RPostgres che ha il pieno supporto per le query parametrate – hadley

+0

Grazie a @hadley. Hai qualche esempio sulla parte parametrizzata?Ho scritto un [post di blog] (http://welcome-to-data-science.blogspot.com/2015/02/how-to-manage-large-amount-of-data-with.html) qualche giorno fa sulle prestazioni di inserti di grandi dimensioni e mi piacerebbe fare un confronto tra i pacchetti. – LauriK

+1

Non ancora, ma sto lavorando a un post sul blog per il blog Rstudio la prossima settimana. Nota che gli inserimenti parametrizzati sono lenti per Postgres, quindi dbWriteTable in RPostgres utilizza una strategia diversa (LOAD INFILE) – hadley

1

A partire dal più recente RPostgreSQL dovrebbe funzionare:

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

Non riesco a far funzionare una cosa simile, almeno con 'dbGetQuery'. Potresti fornire una fonte più dettagliata? – Pranasas

Problemi correlati