0

这是与此问题类似的问题,但我不希望用 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(并且它会自动匹配列的顺序)。

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

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

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

并且数据不会被写入。

4

1 回答 1

0

解决方案

我想出了一个解决方案,主要基于dbWriteFactorAri Friedman 作为对他的问题的回答所写的函数。下面我展示了我使用的代码部分,经过修改以专门用于data.table包。

同样重要的是要注意我必须更改 sqlite 表结构。为了让它工作,我必须从所有自动生成的字段中删除“NOT NULL”名称。

新表结构

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)

wheredb_pars是建立连接的数据库参数列表。

于 2014-09-16T20:35:31.710 回答