0

R はまったくの初心者なので、明らかな質問はご容赦ください。

Deducer のデータフレームで MySQL テーブル (データベース「test」の「exdata3」) を更新しようとしています。

最初にデータベースを呼び出し、テーブルを deducer で使用し、データフレーム 'data1' に格納されているいくつかのクエリを実行しました。ここで、新しい列を含む「data1」を送信し、MySQL の空でないテーブル exdata3 を更新したいと考えています。

(将来、新しい列/行がないかもしれませんが、既存の列は、MySQL の同じ列と比較して、データフレームで異なる値を持つ可能性があります。私の言いたいことがわかっている場合)

データフレームと MySQL のテーブルの違いは、データフレームに「DiffHighLow」列 (テーブル内の他の 2 つの列から計算された値を含む) が追加されていることです。

RODBC を使用して、64 ビット Windows7 で R と MySQL の間の通信を行っています。

その後のエラーで次のことを試しました。

1. > sqlSave(channel, data1, exdata3, append= TRUE,rownames = "DiffHighLow", colnames = TRUE, verbose = FALSE, safer = TRUE, addPK = FALSE, "integer", fast = TRUE, test = FALSE, nastring =ヌル)

sqlSave のエラー (channel, data1, exdata3, append = TRUE, rownames = "DiffHighLow", : オブジェクト 'exdata3' が見つかりません)

2.> sqlSave(channel, data1, rownames = "DiffHighLow", addPK = TRUE)

sqlSave のエラー (channel、data1、rownames = "DiffHighLow"、addPK = TRUE) : 42S21 1060 [MySQL][ODBC 5.3(w) Driver][mysqld-5.0.41-community-nt]重複する列名 'diffhighlow'

[RODBC] エラー: SQLExecDirect 'CREATE TABLE data1 ( DiffHighLowvarchar(255) NOT NULL PRIMARY KEY, exdata3_idinteger, datedouble, opendouble, highdouble, lowdouble, closedouble, shares_integer, turnover_double, diffhighlowdouble)'を実行できませんでした

3番目。> sqlUpdate(チャンネル、データ1、「exdata3」)

sqlUpdate(channel, data1, "exdata3") のエラー: データ フレームの列の日付は、データベース テーブルにありません。

とりわけ、「DiffHighLow」を除いてデータベーステーブルに既に存在する行名を認識しない理由がわかりません

お知らせ下さい。私はSOでそのような質問をたくさん検索し、すでに投稿されたさまざまなソリューション(私のクエリに最も似ている)を試しましたが、どれも機能していないようです。

4

1 に答える 1

1

私の理解が正しければ、テーブルの内容をexdata3MySQL データベースから R にロードし、とりわけ新しい列 を追加して変更し、MySQL データベースDiffHighLowに保存したいと考えています。それがあなたがやろうとしていることである場合、これはうまくいきます:

# this just sets up the example
set.seed(1)    # for reproducible example
df <- data.frame(Open=rnorm(50), Low=rnorm(50), High=rnorm(50), Close=rnorm(50))
library(RODBC)
channel <- odbcConnect(dsn="MySQL", case="nochange")
sqlSave(channel,df,"exdata3", rownames=F)

data1 <- sqlQuery(channel,"select * from exdata3")
data1 <- transform(data1,DiffHighLow=High-Low)

# you start here
sqlQuery(channel,"drop table exdata3")
sqlSave(channel,data1,"exdata3")
result <- sqlQuery(channel,"select * from exdata3")
head(result)

基本的な問題はsqlSave(...) MySQLテーブルがまったく存在しない (この場合は作成される)、データベース内の列に正確にマップする列が含まれている必要があることです。を使用して列を追加することはできません。したがって、このコードは単に の元のバージョンを削除し、 のデータから新しいコピーを作成します。最後の行は、テーブルが機能したことを示すためにテーブルを読み込んでいます。sqlSave(...)exdata3data1

コードにはいくつかの問題があります。

exdata3文字列ではなく変数名を渡すため、最初の試行は失敗します"exdata3"。R 環境で名前が付けられた変数がないexdata3ため、「オブジェクト 'exdata3' が見つかりません」というエラーが発生します。

データ フレームの行名を という列に保存するように ODBC ドライバーに指示しているため、2 回目の試行は失敗しますが、その名前diffhighlowの列が既に存在するdata1ため、ドライバーは同じ名前で 2 つの列を作成しようとしています。

exdata3の列が の列にマップされないため、3 回目の試行は失敗しますdata1

于 2014-09-05T04:57:34.093 に答える