Using package:DBI
, I need to:
rbind
ed as per R terminology or union
ed as per SQL terminology);dbBind()
/dbGetquery()
fullfils requirements 1 and 2, but I then need to write the resulting data frame to the database using dbWriteTable()
, which is ineficient:
library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "iris", iris)
res <- dbGetQuery(con,
"select * from iris where Species = ?",
params = list(c("setosa", "versicolor")))
dbWriteTable(con, "mytable", res)
Conversely, dbExecute()
fulfils requirement 3, but I don't think it has the "rbind
feature". Of course, this throw an error because the table would get overwritten:
dbExecute(con,
"create table mytable as select * from iris where Species = ?",
params = list(c("setosa", "versicolor")))
What is the most efficient/recommended way of doing so?
Notes:
Based on @r2evans comment and @G.Grothendieck answer, instead of query/download/combine/upload, I used a parameterized query that inserts directly into a table.
First, I created the table with the appropriate columns to collect the results:
library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
create_table <-
"
CREATE TABLE
warpbreaks2 (
breaks real,
wool text,
tension text
);
"
dbExecute(con, create_table)
Then I executed an INSERT INTO
step:
dbWriteTable(con, "warpbreaks", warpbreaks)
insert_into <-
"
INSERT INTO
warpbreaks2
SELECT
warpbreaks.breaks,
warpbreaks.wool,
warpbreaks.tension
FROM
warpbreaks
WHERE
tension = ?;
"
dbExecute(con, insert_into, params = list(c("L", "M")))
This is a dummy example for illustration purpose. It could be achieve more directly with e.g.:
direct_query <-
"
CREATE TABLE
warpbreaks3 AS
SELECT
*
FROM
warpbreaks
WHERE
tension IN ('L', 'M');
"
dbExecute(con, direct_query )