Проблемы с RODBC sqlSave - PullRequest
       6

Проблемы с RODBC sqlSave

8 голосов
/ 02 августа 2011

У меня возникают трудности с вставкой фрейма данных в базу данных mySql с использованием RODBC.Ниже код, который я использую:

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"))

Это не имеет никакого смысла для меня как столбцыуже находятся во фрейме данных с такими же именами.

Ответы [ 5 ]

17 голосов
/ 15 августа 2016

Очень старый вопрос, который я знаю, но я только что (и решил для моего случая) ту же самую проблему только сейчас, получая эту ошибку

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

от использования

sqlSave(

Впакет rodbc.

Я решил это, установив

,fast = F

Если кто-нибудь из первых результатов Google попал сюда, надеюсь, это поможет

РЕДАКТИРОВАТЬ: Так что я с тех пор посмотрелна это больше.При установке флажка «F», как я рекомендую ниже, вы вставляете строки, строка за строкой в ​​базу данных.Хотя это была буква «Т», она потерпела бы неудачу, если бы одна строка была неправильной, но теперь эта строка дает сбой, и вы не знаете об этом.Таким образом, в базе данных могут отсутствовать данные, которые, как вы думали, были там.Проверьте количество строк в базе данных по сравнению с количеством строк, которые вы ожидаете вставить в ваш фрейм данных.Возможно, у вас есть единственное значение, которое несовместимо.Теперь я использовал функцию «вставить» в цикле, чтобы создать строку типа «вставить в значения tableName (« eg1 »,« eg2 »)», и таким образом я смогу получить сообщения об ошибках о том, почему она не пошлав базу данных

1 голос
/ 27 июня 2016

Я получил ту же ошибку, и проблема заключалась в типах данных таблицы назначения.Даже кажется, что было возможно преобразование данных.
Шаги решения:

  1. использование неиспользуемого имени таблицы (новая таблица);
  2. set append = False и получить «создать таблицу», отображаемую при ошибке msg;
  3. запустить создание таблицы в базе данных;
  4. «saveSql» теперь работает либо с append = False, либо append = True.

Полезно установить "verbose = T", чтобы точно определить, где возникает проблема.

1 голос
/ 10 января 2014

различные ошибки могут привести к одной и той же ошибке. Так что не ясно, поможет ли это вам: однако, если "tablename = 'wellAnalysedDataTablealready" уже создан в базе данных mySql как пустая таблица, вы получите эту ошибку. Попробуйте удалить ее и позвольте функции sqlsave (...) позаботиться об этом

0 голосов
/ 15 августа 2015

Если проблема на самом деле связана с чувствительностью к регистру, то похоже, что есть простое решение без изменения каких-либо функций с помощью опции «сохранить», которая появляется в строке, отмеченной Ари Б. Фридманом: «nochange = cnames ». Итак, когда вы изначально создаете свой канал RODBC, вы можете просто указать это как вариант case:

my_sql_channel <<- odbcConnect("myOdbc", case="nochange")
0 голосов
/ 02 августа 2011
> 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)
...