Search code examples
rdata.tabledbirpostgres

How to use dbSendQuery to import different CSV files into 1 SQL database table using R?


Referring to this page,I am using following code trying to insert multiple csv files into SQL database table using R

#Step 1: Libraries
library(RPostgres)
library(data.table)
library(DBI)

#Step 2: make a dataframe of all files
file_names1 <- dir("C:/Users/Akanksha/Desktop/BSRN_TestRowsOnly/", full.names = TRUE, recursive = T) #where you have your files
my_data_frame <- do.call(rbind,lapply(file_names1,read.csv))


#Step 3: Establish Connection using RPostgres
dsn_database = "..."   # Specify the name of your Database
dsn_hostname = "localhost"  # Specify host name e.g.:"aws-us-east-1-portal.4.dblayer.com"
dsn_port = "5432"                # Specify your port number. e.g. 98939
dsn_uid = "..."         # Specify your username. e.g. "admin"
dsn_pwd = "..."        # Specify your password. e.g. "xxx"

tryCatch({
  drv <- dbDriver("Postgres")
  print("Connecting to Database…")
  connec <- dbConnect(drv, 
                      dbname = dsn_database,
                      host = dsn_hostname, 
                      port = dsn_port,
                      user = dsn_uid, 
                      password = dsn_pwd)
  print("Database Connected!")
},
error=function(cond) {
  print("Unable to connect to Database.")
})

#Step 4: Run and Test Queries using RPostgres
dbSendQuery(connec, "DROP TABLE IF EXISTS Population")  #Table name is Population

#Step 5: Importing
RPostgres::dbSendQuery(
  connec, 
  "INSERT INTO mytable (Population) 'my_data_frame';",
)

It returns an error:

Error: Failed to prepare query: ERROR:  syntax error at or near "'my_data_frame'"
LINE 1: INSERT INTO mytable (Population) 'my_data_frame';
                               ^
In addition: Warning message:
In result_create(conn@ptr, statement, immediate) :
  Closing open result set, cancelling previous query

I have tried different ways but no success. I am really stuck with this task, Could anyone please help me in resolving the present code or to suggest a new code to copy paste different csv files to 1 SQL table using R. R and SQL both are new things for me.


Solution

  • The remote SQL server has no visibility or awareness of your local working environment, so passing a string literal 'my_data_frame' will not work. (It would be a huge security problem if that were the case.) Pass it the data.

    Note: your SQL statements are fine by themselves but inconsistent drop table if exists Population suggests there is a table named Population, but insert into mytable (Population) ... suggests there is a table named mytable and a column named Population within that table. They are syntactically fine, and it is certainly feasible to have two tables mytable and Population where the former happens to have a column named Population, but ... it seems like it's likely to be a mistake.

    Use dbAppendTable. Working example using mtcars and a local sqlite.

    library(DBI)
    sqlite <- dbConnect(RSQLite::SQLite())
    dbWriteTable(sqlite, "mytable", mtcars[1,], create = TRUE)
    dbAppendTable(sqlite, "mytable", mtcars[2:4,1:3])            # <-----
    # [1] 3
    dbGetQuery(sqlite, "select * from mytable")
    #    mpg cyl disp  hp drat   wt  qsec vs am gear carb
    # 1 21.0   6  160 110  3.9 2.62 16.46  0  1    4    4
    # 2 21.0   6  160  NA   NA   NA    NA NA NA   NA   NA
    # 3 22.8   4  108  NA   NA   NA    NA NA NA   NA   NA
    # 4 21.4   6  258  NA   NA   NA    NA NA NA   NA   NA