这与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)
数据无法写入。
答案 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
是用于建立连接的数据库参数列表。