Почему sqlSave из пакета RODBC не работает при добавлении данных в существующую таблицу?

Я создал пустую таблицу в базе данных mysql со следующей спецификацией

    Field          Type Null Key           Default                       Extra
1      Id       int(11)   NO PRI              <NA>              auto_increment
2    Date     timestamp   NO     CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
3 Country   varchar(45)  YES                  <NA>                            
4   Brand   varchar(45)  YES                  <NA>                            
5   Value decimal(10,0)  YES                  <NA>                          

Теперь я хотел бы использовать sqlSave из пакета RODBC для добавления данных в кадр данных в эту таблицу. Мой фрейм данных выглядит так

     Id       Date Country  Brand Value
591 591 2013-06-22      DK bet365    44
603 603 2013-09-14      DK bet365    69
362 362 2009-01-31      DK bet365    22
296 296 2013-08-31      DK unibet    33
216 216 2012-02-18      DK unibet    24
261 261 2012-12-29      DK unibet    28
326 326 2008-05-24      DK bet365    18
521 521 2012-02-18      DK bet365    71
494 494 2011-08-13      DK bet365    44
558 558 2012-11-03      DK bet365    68

и может быть воссоздан с помощью

mydf<-structure(list(Id = c(591L, 603L, 362L, 296L, 216L, 261L, 326L, 521L, 494L, 558L), 
                 Date = c("2013-06-22", "2013-09-14", "2009-01-31", "2013-08-31", "2012-02-18", "2012-12-29", "2008-05-24", "2012-02-18", "2011-08-13", "2012-11-03"), Country = c("DK", "DK", "DK", "DK", "DK", "DK", "DK", "DK", "DK", "DK"), 
                 Brand = structure(c(2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
                                   .Label = c("unibet", "bet365", "betsafe"), 
                                   class = "factor"), 
                 Value = c(44, 69, 22, 33, 24, 28, 18, 71, 44, 68)), 
            .Names = c("Id", "Date", "Country", "Brand", "Value"), 
            row.names = c(591L, 603L, 362L, 296L, 216L, 261L, 326L, 521L, 494L, 558L), 
            class = "data.frame")

Затем я запускаю следующую команду

sqlSave(channel, dat=mydf, tablename="GoogleTrends", rownames=FALSE, append=TRUE)

что приводит к ошибке:

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

Я пытался добавить varTypes, но все равно не повезло. Я также пытался использовать sqlUpdate, но не могу заставить его работать. Чтобы быть ясным, я могу легко заставить это работать, если я позволю sqlSave создать саму таблицу. Итак, я думаю, что есть какая-то проблема с преобразованием, но я не могу ее обнаружить. Кто-нибудь знает, как это решить?


person Dr. Mike    schedule 11.11.2013    source источник


Ответы (3)


могу я спросить, как вы определили varTypes? Я думал, что использование varTypes будет работать. Что бы я сделал, так это получить тип переменной из уже созданной таблицы и заставить R сопоставить ее. В R вы можете получить vartypes уже созданной таблицы, используя что-то вроде этого tmp ‹- sqlColumns(channel, tablename) и то, что вам нужно, это varspec ‹- tmp$TYPE_NAME.

person ThinkStatsme    schedule 15.01.2014

У меня возникла такая же проблема в моей системе Windows с использованием драйвера MySQL ODBC версии 5.2. Аргумент case="nochange" в odbcConnect помог. Без этого аргумента sqlSave переводит имена столбцов во фрейм данных в нижний регистр.

person André le Blond    schedule 23.06.2014

Я столкнулся с очень похожей проблемой и нашел здесь проблемы с RODBC sqlSave, которые быстро вращаются = F решает проблему.

person rookieJoe    schedule 06.06.2017