Field.types 在 SQL 服务器数据库中使用 R DBI 包中的 dbWriteTable 时不工作

Field.types not working when using dbWriteTable from R DBI package in SQL Server database

我正在使用 DBI 包和 odbc 包连接到 SQL 服务器数据库。我正在尝试使用 field.types 参数指定的列类型编写 table。出于某种原因,这不起作用,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" 的 table 列

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

我的问题:

  1. 我如何更正上面的示例,以便数据库中两列的列类型都为 varchar(50)

  2. 如何在其他示例中正确使用 field.types 参数?

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

在此先感谢您的帮助。

我试过你的例子(稍作修改):

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

并且运行顺利:

至少接受以下数据类型(来自DBI documentation):

  • 整数
  • 数字
  • 逻辑布尔值(一些后端可能 return 一个整数)
  • 不适用
  • 字符
  • 因子(绑定为字符,带有警告)
  • 日期
  • POSIXct 时间戳
  • POSIXlt 时间戳
  • blob 的原始列表(SQL NULL 值的 NULL 条目)
  • blob::blob
  • 类型的对象