gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:28:43 24 4
gpt4 key购买 nike

使用 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 );

最佳答案

因为他们似乎没有办法说服 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") )

关于r - 如何一次执行多个 RSQLite 语句或如何转储整个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com