Field.types не работает при использовании dbWriteTable из пакета R DBI в базе данных SQL Server

Я использую пакет DBI вместе с пакетом odbc для подключения к базе данных SQL Server. Я пытаюсь написать таблицу с типами столбцов, указанными аргументом field.types. По какой-то причине это не работает, и R выбирает свои собственные типы данных при записи.

Воспроизводимый пример:

table <- data.frame(
  col1 = 1:2,
  col2 = c("a", "b")
)

con <- dbConnect(
  odbc::odbc(),
  dsn   = "dsn",
  UID   = login,
  PWD   = password,
  Port  = 1433
)

dbWriteTable(
  conn = con,
  value = table,
  name = "tableName",
  row.names = FALSE,
  field.types = c(
    col1 = "varchar(50)",
    col2 = "varchar(50)"
  )
)

Результат: таблица с именем "tableName" со столбцами

[col1] [int] NULL,
[col2] [varchar](255) NULL

Мои вопросы:

  1. Как я могу исправить мой пример выше, чтобы типы столбцов в базе данных были varchar(50) для обоих столбцов?

  2. Как я могу правильно использовать аргумент field.types для других примеров?

Я хотел бы знать, какие «типы» я должен использовать: мне нужно «int», «целое число» или «INT» (R чувствителен к регистру, поэтому это может иметь значение)? И потом, где я могу найти список этих типов данных? Я пробовал использовать dbDataType, но использование типов, возвращаемых этой функцией, тоже не работает. Или я делаю что-то еще не так?

Заранее благодарю за любую помощь.


person Willem    schedule 06.10.2017    source источник


Ответы (1)


Я попробовал ваш пример (слегка измененный):

lybrary(RMySQL)
lybrary(lubridate)

conn=dbConnect(MySQL(), user='root', password='', dbname='DB', host='localhost')

table <- data.frame(
    col1 = 1:2,
    col2 = c("a", "b"),
    col3 = c(now(), now()+seconds(1))
)

dbWriteTable(
  conn = conn,
  name='test_DB',
  value = table,
  row.names = FALSE,
  field.types = c(
      col1 = "varchar(50)",
      col2 = "varchar(50)",
      col3 = 'timestamp'
  )
)

и это работало гладко: declare_data_typed_dbWriteTable

Допускаются как минимум следующие типы данных (из документации DBI ):

  • целое число
  • числовой
  • логично для логических значений (некоторые бэкенды могут возвращать целое число)
  • NA
  • персонаж
  • фактор (связанный как символ, с предупреждением)
  • Свидание
  • Временные метки POSIXct
  • Временные метки POSIXlt
  • списки необработанных данных для больших двоичных объектов (с записями NULL для значений SQL NULL)
  • объекты типа blob::blob
person dieguico    schedule 09.11.2017
comment
Ты прав. Я повторил это, и теперь это работает. Очень странный. Я не уверен, что здесь произошло, но я рад, что теперь это работает. Спасибо! - person Willem; 08.12.2017
comment
Как мы могли бы добавить тип поля для списка переменных вместо того, чтобы идти по одной? - person Laura K; 26.06.2019