9

私のデータベーステーブルはおおよそ次のようになります。

+-----+-------+--------------------+-----------+----------+
| ID1 | ID2   | FilePath1          | FilePath2 | Status   |
+-----+-------+--------------------+-----------+----------+
| 1   | Test1 | MyFolder\R\Folder1 | NULL      | Open     |
| 2   | Test2 | MyFolder\R\Folder2 | NULL      | Open     |
| 3   | Test3 | MyFolder\R\Folder3 | NULL      | Finished |
| 4   | Test4 | MyFolder\R\Folder4 | NULL      | Finished |
+-----+-------+--------------------+-----------+----------+

最初の列 (ID1) は PK として定義されます。ただし、ID2 も一意です。

今、パッケージから変更FilePath2StatusてRを使用できるようにしたいと思います。だから私は次のことを試します:sqlUpdate()RODBC

db.df <- data.frame(ID1=1, ID2='Test1',
                    FilePath2='MyFolder\R\Folder5', Status='Finished',
                    stringsAsFactors=FALSE)

sqlUpdate(myconn, db.df, tablename='mytable', index='ID2', verbose=TRUE)

ここdb.dfで は、データベース テーブル内の名前に対応する 1 つの行と列の名前を持つデータ フレームです (ただし、この場合、いくつかの列を省略しています。可能であれば、もFilePath1省略したいと思います)。ID1私の目的は、次のものを取得することです。

+-----+-------+--------------------+--------------------+----------+
| ID1 | ID2   | FilePath1          | FilePath2          | Status   |
+-----+-------+--------------------+--------------------+----------+
| 1   | Test1 | MyFolder\R\Folder1 | MyFolder\R\Folder5 | Finished |
| 2   | Test2 | MyFolder\R\Folder2 | NULL               | Open     |
| 3   | Test3 | MyFolder\R\Folder3 | NULL               | Finished |
| 4   | Test4 | MyFolder\R\Folder4 | NULL               | Finished |
+-----+-------+--------------------+--------------------+----------+

次のエラーが表示されます。

Error in sqlUpdate(myconn, db.df, tablename = 'mytable', index = 'ID2',  : 
index column(s) ID2 not in database table

この問題の原因は何ですか?


編集:直接SQLクエリを送信することで問題を回避しました:

out.path <- 'MyFolder\\\\R\\\\Folder5'
update.query <- paste("UPDATE mytable ", 
                  "SET FilePath2='", out.path, "', Status='Finished' ",
                  "WHERE ID2='Test1'", sep="")
dummy <- sqlQuery(myconn, update.query)

これはきちんとした方法ではないかもしれませんが、やるべきことを行います。しかし、私はまだ何が問題なのか理解していないsqlUpdateので、誰かがそれを明らかにしてくれることを願っています.

4

3 に答える 3

1

sqlUpdateMySQL でテーブルを更新するために使用したときに、同様の問題が発生しました。caseR-MySQL接続で属性を設定することで修正しました。

詳細は次のとおりです。

MySQL では:

create table myTable (
myName1 INT NOT NULL PRIMARY KEY,
myName2 VARCHAR(10) NOT NULL,
);

insert into myTable values(111, 'Test1')
insert into myTable values(222, 'Test2')

Rで:

myDF <- data.frame(myName1 = 111, myName2 = 'Test3')
sqlUpdate(myConn, myDF, tablename='myTable', index = 'myName1', verbose=TRUE)

#> Error in sqlUpdate(myConn, myDF, tablename='myTable', index = 'myName1', verbose=TRUE) : 
  index column(s) myName1 not in data frame

その理由は、RMySQL 接続の (デフォルト?) 属性に次のものがあるためです。

> attr(myConn, "case")
[1] "tolower"

したがって、myName1myDF の colname は大文字と小文字がmyname1insideに変更されるため、指定されたインデックスsqlUpdateと一致しません。myName1

で呼び出しを変更すると機能しないことに注意してくださいindex = 'myname1'。のエラーindex column(s) myName1 not in database tableが報告されます。MySQL テーブルでは、colname は myName であるためです。

解決策は、接続時または接続後にケース属性を「nochange」に設定することです。

attr(myConn, "case") <- 'nochange'

詳細は次のとおりです。

debugonce(sqlUpdate)与えます:

   cnames <- colnames(dat)
    cnames <- mangleColNames(cnames)
    cnames <- switch(attr(channel, "case"), nochange = cnames, 
        toupper = toupper(cnames), tolower = tolower(cnames))
    cdata <- sqlColumns(channel, tablename)
    coldata <- cdata[c(4L, 5L, 7L, 9L)]
    if (is.character(index)) {
        intable <- index %in% coldata[, 1L]
        if (any(!intable)) 
            stop("index column(s) ", paste(index[!intable], collapse = " "), 
                " not in database table")
        intable <- index %in% cnames
        if (any(!intable)) 
            stop("index column(s) ", paste(index[!intable], collapse = " "), 
                " not in data frame")
        indexcols <- index
    }

とのintable呼び出しに注意してください。cnamecoldata

于 2016-03-07T19:48:28.013 に答える