psychemedia
psychemedia

Reputation: 5940

How to import from SQLite database?

I have an SQLite database file exported from Scraperwiki with .sqlite file extension. How do I import it into R, presumably mapping the original database tables into separate data frames?

Upvotes: 29

Views: 23425

Answers (3)

sgibb
sgibb

Reputation: 25736

You could use the RSQLite package.

Some example code to store the whole data in data.frames:

library("RSQLite")

## connect to db
con <- dbConnect(drv=RSQLite::SQLite(), dbname="YOURSQLITEFILE")

## list all tables
tables <- dbListTables(con)

## exclude sqlite_sequence (contains table information)
tables <- tables[tables != "sqlite_sequence"]

lDataFrames <- vector("list", length=length(tables))

## create a data.frame for each table
for (i in seq(along=tables)) {
  lDataFrames[[i]] <- dbGetQuery(conn=con, statement=paste("SELECT * FROM '", tables[[i]], "'", sep=""))
}

dbDisconnect(con)

Upvotes: 53

HackJob99
HackJob99

Reputation: 109

Putting together sgibb's and primaj's answers, naming tables, and adding facility to retrieve all tables or a specific table:

getDatabaseTables <- function(dbname="YOURSQLITEFILE", tableName=NULL){
  library("RSQLite")
  con <- dbConnect(drv=RSQLite::SQLite(), dbname=dbname) # connect to db
  tables <- dbListTables(con) # list all table names

  if (is.null(tableName)){
    # get all tables
    lDataFrames <- map(tables, ~{ dbGetQuery(conn=con, statement=paste("SELECT * FROM '", .x, "'", sep="")) })
    # name tables
    names(lDataFrames) <- tables
    return (lDataFrames)
  }
  else{
    # get specific table
    return(dbGetQuery(conn=con, statement=paste("SELECT * FROM '", tableName, "'", sep="")))
  }
}

# get all tables
lDataFrames <- getDatabaseTables(dbname="YOURSQLITEFILE")

# get specific table
df <- getDatabaseTables(dbname="YOURSQLITEFILE", tableName="YOURTABLE")

Upvotes: 2

primaj
primaj

Reputation: 93

To anyone else that comes across this post, a nice way to do the loop from the top answer using the purr library is:

lDataFrames <- map(tables, ~{
  dbGetQuery(conn=con, statement=paste("SELECT * FROM '", .x, "'", sep=""))
})

Also means you don't have to do:

lDataFrames <- vector("list", length=length(tables))

Upvotes: 7

Related Questions