如何使用自动生成的字段附加到R中的SQLite表

时间:2014-09-12 16:47:51

标签: r rsqlite r-dbi

这与this question类似,但我不希望用NA填充缺少的列,因为缺少的列具有有意义的默认值,包括主键。

我试图从R附加到SQLite表,其中表有一些自动生成的字段,特别是主键和两个时间戳值。第一个时间戳是创建日期,第二个时间戳是修改日期。

这是表结构:

CREATE TABLE "level1" (
  "l1id" bigint(20)  NOT NULL ,
  "l0id" bigint(20)  DEFAULT NULL,
  "acid" bigint(20)  DEFAULT NULL,
  "cndx" int(11) DEFAULT NULL,
  "repi" int(11) DEFAULT NULL,
  "created_date" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "modified_date" timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  "modified_by" varchar(100) DEFAULT NULL,
  PRIMARY KEY ("l1id")
)

当我尝试使用MySQL执行完全相同的操作时,dbWriteTable会自动处理缺失列的默认值,并正确填充主键和created_date(并且它会自动匹配列的顺序)。< / p>

如何使用RSQLite包实现相同的行为?我不确定我是否错误地配置了数据库,或者我是否需要R中的一些附加步骤?

我尝试使用NA&amp;预先填充缺少的字段'null',但在这两种情况下我都会收到错误消息:

Warning message:
In value[[3L]](cond) :
  RS-DBI driver: (RS_SQLite_exec: could not execute: column l1id is not unique)

数据无法写入。

1 个答案:

答案 0 :(得分:0)

解决方案

我找到了一个解决方案,主要基于dbWriteFactor函数Ari Friedman写的answer to his question。下面我展示了我使用的代码部分,修改后专门用于data.table包。

非常重要 要注意我必须更改sqlite表结构。为了使这个工作,我不得不删除&#34; NOT NULL&#34;从所有自动生成的字段中指定。

新表结构

CREATE TABLE "level1" (
  "l1id" INTEGER PRIMARY KEY,
  "l0id" bigint(20)  DEFAULT NULL,
  "acid" bigint(20)  DEFAULT NULL,
  "cndx" int(11) DEFAULT NULL,
  "repi" int(11) DEFAULT NULL,
  "created_date" timestamp DEFAULT CURRENT_TIMESTAMP,
  "modified_date" timestamp DEFAULT '0000-00-00 00:00:00',
  "modified_by" varchar(100) DEFAULT NULL
);

改编代码示例

dbcon <- do.call(dbConnect, db_pars)

tempTbl <- "temp_table"
if (dbExistsTable(dbcon, tempTbl)) dbRemoveTable(dbcon, tempTbl)
dbWriteTable(conn = dbcon, 
             name = tempTbl, 
             value = dat, 
             row.names = FALSE, 
             append = FALSE)
tbl_flds <- loadColNames(tbl, db)
tmp_flds <- names(dat)
status <- dbSendQuery(dbcon, 
                      paste("INSERT INTO", tbl, 
                            "(", paste(tmp_flds, collapse = ","), ")",
                            "SELECT",
                            paste(tmp_flds, collapse = ","),
                            "FROM",
                            tempTbl))
# Remove temporary table
dbRemoveTable(dbcon, tempTbl)

dbDisconnect(dbcon)

其中db_pars是用于建立连接的数据库参数列表。