6

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

为什么这些不起作用

sql <- readLines("createtables.sql")
dbSendQuery(con,sql)

... 和 ...

sql <- paste(readLines("createtables.sql"),collapse="")
dbSendQuery(con,sql)

... 和 ...

sql <- paste(readLines("createtables.sql"),collapse="\n")
dbSendQuery(con,sql)

虽然这些可以:

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)

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 );
4

1 回答 1

6

因为他们似乎无法说服 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") )
于 2013-09-23T07:01:46.050 回答