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関数を一度に複数のステートメントを実行するよう説得する方法はないように思われるので、この問題を解決する2つの関数を書きました:

(1) sqlFromFile()SQL ファイルを読み込み、テキストを変換して、各ステートメントが正確に 1 行をカバーするようにします。

(2) RSQLite によって提供されるものに似ていますが、提供されたテキストの各行 (ベクトルの各要素) にクエリ関数を適用して、一連のステートメント全体を実行できるようにしますdbSendQueries()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") )
于 2013-09-23T07:01:46.050 に答える