从SQL Server数据库中的R DBI包使用dbWriteTable时,Field.types无法正常工作

时间:2017-10-06 10:57:16

标签: sql-server r odbc r-dbi

我正在使用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参数用于其他示例?

  3. 我想知道的是,我应该使用什么“类型”:我需要“int”或“integer”或“INT”(R区分大小写,这可能很重要)?然后,我在哪里可以找到这些数据类型的列表?我尝试使用dbDataType,但使用此函数返回的类型也不起作用。或者我做错了什么?

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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 documentation):

  • 整数
  • 数字
  • 布尔值的逻辑(某些后端可能返回一个整数)
  • NA
  • 字符
  • factor(绑定为字符,带警告)
  • 日期
  • POSIXct时间戳
  • POSIXlt时间戳
  • 用于blob的raw的列表(具有SQL NULL值的NULL条目)
  • blob :: blob类型的对象