使用Rsqlite构建sqlite数据库我希望一次发送多个语句 – 这可能吗?
为什么这些不起作用:
sql <- readLines("createtables.sql") dbSendQuery(con,sql)
……而且……
sql <- paste(readLines("createtables.sql"),collapse="") dbSendQuery(con,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)
/* table def: birthdays */ CREATE TABLE birthdays ( nameid INTEGER PRIMARY KEY AUTOINCREMENT,birthday DATE ) ; /* table def: foodtypes */ CREATE TABLE foodtypes ( foodid INTEGER PRIMARY KEY AUTOINCREMENT,`kcal/100g` float );
解决方法
因为他们根本无法说服Rsqlite函数同时执行多个语句,所以我写了两个函数来解决这个问题:
(1)sqlFromFile()读入sql文件并转换文本,以便每个语句只包含一行.
(2)dbSendQueries()类似于Rsqlite提供的dbSendQuery(),但将查询函数应用于提供的文本的每一行(向量的每个元素),以便可以运行整个语句.
# 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") )