【问题标题】:Field.types not working when using dbWriteTable from R DBI package in SQL Server database在 SQL Server 数据库中使用 R DBI 包中的 dbWriteTable 时,Field.types 不起作用
【发布时间】:2023-04-05 17:46:01
【问题描述】:

我正在使用 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,但使用此函数返回的类型也不起作用。还是我做错了什么?

提前感谢您的帮助。

【问题讨论】:

    标签: sql-server r odbc r-dbi


    【解决方案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'
      )
    )
    

    而且运行顺利:

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

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

    【讨论】:

    • 你是对的。我重试了这个,现在它可以工作了。很奇怪。我不确定这里发生了什么,但我很高兴它现在有效。谢谢!
    • 我们怎样才能为变量列表添加字段类型而不是一一添加?
    猜你喜欢
    • 2021-06-26
    • 2012-02-10
    • 2020-05-03
    • 2020-05-02
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多