如何一次执行多个RSQLite语句或如何转储整个文件?

pet*_*ner 5 sqlite r

使用RSQLite构建SQLite数据库我希望一次发送多个语句 - 这可能吗?

为什么这些工作:

sql <- readLines("createtables.sql")
dbSendQuery(con,sql)
Run Code Online (Sandbox Code Playgroud)

......而且......

sql <- paste(readLines("createtables.sql"),collapse="")
dbSendQuery(con,sql)
Run Code Online (Sandbox Code Playgroud)

......而且......

sql <- paste(readLines("createtables.sql"),collapse="\n")
dbSendQuery(con,sql)
Run Code Online (Sandbox Code Playgroud)

而这些做:

sql <- "CREATE TABLE birthdays (
nameid INTEGER PRIMARY KEY AUTOINCREMENT ,
firstname VARCHAR(100) NOT NULL ,
lastname VARCHAR(100) NOT NULL ,
birthday DATE ) ; "
dbSendQuery(con,sql)

sql <- "/* table def: foodtypes */
CREATE TABLE foodtypes (
foodid INTEGER PRIMARY KEY AUTOINCREMENT ,
foodname VARCHAR(100) NOT NULL,
healthy INTEGER,
`kcal/100g` float );"
dbSendQuery(con,sql)
Run Code Online (Sandbox Code Playgroud)

createtables.sql的内容是:

/* table def:  birthdays */
CREATE TABLE birthdays (
nameid INTEGER PRIMARY KEY AUTOINCREMENT ,
firstname VARCHAR(100) NOT NULL ,
lastname VARCHAR(100) NOT NULL ,
birthday DATE ) ;

/* table def: foodtypes */
CREATE TABLE foodtypes (
foodid INTEGER PRIMARY KEY AUTOINCREMENT ,
foodname VARCHAR(100) NOT NULL,
healthy INTEGER,
`kcal/100g` float );
Run Code Online (Sandbox Code Playgroud)

pet*_*ner 5

因为他们根本无法说服RSQLite函数同时执行多个语句,所以我写了两个函数来解决这个问题:

(1)sqlFromFile()读入SQL文件并转换文本,以便每个语句只包含一行.

(2)dbSendQueries()类似于dbSendQuery()RSQLite提供的,但将查询函数应用于所提供文本的每一行(向量的每个元素),以便可以运行整个语句.

# read in sql-statements and preformat them                                        
sqlFromFile <- function(file){
    require(stringr)
    sql <- readLines(file)
    sql <- unlist(str_split(paste(sql,collapse=" "),";"))
    sql <- sql[grep("^ *$", sql, invert=T)]
    sql
}

# apply query function to each element
dbSendQueries <- function(con,sql){
    dummyfunction <- function(sql,con){
        dbSendQuery(con,sql)
    }
    lapply(sql, dummyfunction, con)
}

# solution for example in question
dbSendQueries( con, sqlFromFile("createtables.sql") )
Run Code Online (Sandbox Code Playgroud)