2011-08-02 2 views
7

RODBC를 사용하여 데이터 프레임을 데이터베이스에 삽입하는 데 어려움이 있습니다. 다음은 내가 사용하는 코드입니다 :RODBC sqlSave 문제

data <- data.frame(analysedDataID=c(1,2,3), plateWell=c("a","b","c"), screenPlateOrder=c(1,2,3), wellData=c("A","B","C")) 

con <- odbcConnect(DSN, uid="user_id", pwd="some_password") 
query <- sqlSave(con, data, tablename = 'wellAnalysedDataTable', rownames=FALSE, append=TRUE) 

내가 이것을 실행하려고 나는 다음과 같은 오류 메시지가 얻을 : 여기

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
missing columns in 'data' 

내가 데이터를 삽입하기 위해 노력하고있어 특정 테이블입니다 입력 :

+------------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+------------------+-------------+------+-----+---------+-------+ 
| analysedDataID | int(10)  | YES |  | NULL |  | 
| plateWell  | varchar(10) | YES |  | NULL |  | 
| screenPlateOrder | int(10)  | YES |  | NULL |  | 
| wellData   | varchar(30) | YES |  | NULL |  | 
+------------------+-------------+------+-----+---------+-------+ 

나는이 설명서를 여러 번 읽고 계속 읽었으므로이 점에서 혼란스러워하지만이 기능은 작동하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다!

건배!


고마워요! 귀하가 제안한 변경 사항을 추가했으며 더 이상 사례에 문제가없는 것으로 보입니다. 나는 다음과 같은 오류 메시지가 계속하지만 :

'index column(s) analysedDataID plateWell screenPlateOrder wellData not in data frame' 

내가 실행하고있어 문이이이 생성 열이 이미으로

sqlUpdate(con, data, tablename="wellAnalysedDataTable", index=c("analysedDataID", "plateWell", "screenPlateOrder", "wellData")) 

이 나에게 어떤 이해가되지 않습니다 동일한 colnames를 가진 데이터 프레임

답변

0
> str(data) 
'data.frame': 3 obs. of 4 variables: 
$ analysedDataID : num 1 2 3 
$ plateWell  : Factor w/ 3 levels "a","b","c": 1 2 3 
$ screenPlateOrder: num 1 2 3 
$ wellData  : Factor w/ 3 levels "A","B","C": 1 2 3 

숫자 정수 및 요인 문자를 사용해 보셨습니까?

data <- data.frame(analysedDataID=as.integer(c(1,2,3)), plateWell=c("a","b","c"), screenPlateOrder=as.integer(c(1,2,3)), wellData=c("A","B","C"),stringsAsFactors=FALSE) 
+0

안녕 GSK3 도움이되기를 바랍니다. 답장을 보내 주셔서 감사합니다. 제안 된 변경 사항으로 시도했지만 여전히 작동하지 못했습니다. "계속 테이블에 추가 할 수 없습니다."라는 오류 메시지가 계속 나타납니다. tablename 변수가 입력 문자를 모두 소문자로 변환하는 것으로 보입니다. 즉, 데이터 프레임을 삽입하려는 테이블과 일치하지 않습니다. 대소 문자를 어떻게 구분할 수 있는지 알고 있습니까? RODBC의 설명서를 보았지만 언급하지 않았습니다. – hberven1

+0

'odbcUpdate'를 입력하면 전체 함수 정의를 얻을 수 있습니다. 여기에서 채널에 '대소 문자'라는 속성이 있는지 확인할 수 있습니다.이 속성은 위 또는 아래로 설정됩니다. 왜 "보존"옵션이 없는지 잘 모르겠지만 odbcUpdate를 자신의 기능 버전으로 덮어 쓸 가능성이 있습니다. 관련 라인은'cnames <- 스위치 (attr (채널, "대문자"), nochange = cnames, toupper = toupper (cnames), tolower = tolower (cnames))' –

1

다른 오류로 인해 동일한 오류 메시지가 발생할 수 있습니다. 따라서 이것이 도움이되는지 여부는 명확하지 않습니다 : "tablename = 'wellAnalysedDataTablealready'가 이미 빈 테이블로 mySql 데이터베이스에 생성 된 경우이 오류가 발생합니다. 제거하고 sqlsave (...) 함수를 사용하십시오 알아서 처리하십시오

0

문제가 실제로 대소 문자를 구분하는 경우 Ari B. Friedman이 지적한 줄에 나타나는 "보존"옵션을 사용하여 기능을 변경하지 않고도 쉽게 해결할 수있는 것처럼 보입니다. "nochange = CNAMES"당신이 처음에 RODBC 채널을 만들 때, 당신은 단순히 경우 옵션으로 지정할 수 있습니다..

my_sql_channel <<- odbcConnect("myOdbc", case="nochange") 
0

저도 같은 오류가 발생했습니다하고 문제가 대상 테이블 데이터 형식 이었음에도 데이터 변환이 가능한 것 같습니다.
용액 단계 같았다 :

  1. 사용되지 않는 테이블 이름 (새로운 테이블);
  2. append = False로 설정하고 오류 메시지에 표시된 "create table"을 얻습니다.
  3. 데이터베이스에서 테이블을 생성합니다.
  4. "saveSql"은 이제 append = False 또는 append = True로 작동합니다.

"verbose = T"로 설정하면 문제가 발생한 위치를 정확하게 확인할 수 있습니다.

13

아주 오래된 질문 알아요,하지만 난 RODBC 패키지에서

sqlSave(

를 사용하여이 오류

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
    missing columns in 'data' 

을 받고, 지금 같은 문제가 있었다 (나의 예를 들어 해결).

나는 첫 번째 구글에서 다른 사람이 여기 땅을 발생하는 경우

,fast = F 

를 설정하여 그것을 해결이

+0

어떤 것이 이것이 차이를 가져와야하는가? – keuleJ

+0

fast = F는 행 단위로 데이터를 삽입한다는 것을 의미합니다. 배치 (fast = T)에서 문제가 발생하는 이유를 모르겠다.이 작업을 더 이상 수행하지 않으면 sqlSave를 사용하지 않는다. 일반적으로 sqlQuery를 사용하고 각 행마다 붙여 넣기를 사용하여 문자열을 만듭니다. – ChristyCasey