使用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)
因为他们根本无法说服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)
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |