0

これはこの質問と同様の問題ですが、欠落している列には主キーを含む意味のあるデフォルト値があるため、欠落している列に NA を入力したくありません。

R から SQLite テーブルに追加しようとしています。テーブルには自動生成されたフィールド、特に主キーと 2 つのタイムスタンプ値があります。最初のタイムスタンプは作成日で、2 番目のタイムスタンプは変更日です。

テーブル構造は次のとおりです。

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

ソリューション

dbWriteFactorアリ・フリードマンが彼の質問への回答として書いた関数に主に基づいて、解決策を見つけました。以下に、私が使用したコードの一部を示します。これは、特に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)

ここdb_parsで、接続を確立するためのデータベース パラメータのリストです。

于 2014-09-16T20:35:31.710 に答える