1

我正在使用 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”还是“integer”还是“INT”(R 区分大小写,所以可能很重要)?然后,我在哪里可以找到这些数据类型的列表?我曾尝试使用 dbDataType,但使用此函数返回的类型也不起作用。还是我做错了什么?

提前感谢您的帮助。

4

1 回答 1

3

我尝试了您的示例(稍作修改):

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 文档):

  • 整数
  • 数字
  • 逻辑布尔值(一些后端可能返回一个整数)
  • 不适用
  • 特点
  • 因子(绑定为字符,带有警告)
  • 日期
  • POSIXct 时间戳
  • POSIXlt 时间戳
  • blob 的原始列表(带有 SQL NULL 值的 NULL 条目)
  • blob::blob 类型的对象
于 2017-11-09T12:35:13.960 回答