使用dbWriteTable时可以为field.types设置默认值吗?

时间:2020-06-11 21:15:14

标签: r sql-server

我正在尝试使用以下行将数据帧写入SQL Server

dbWriteTable(conn,"r_test_upload",df, field.types = c(longnotes ="varchar(max)"))

默认情况下,它尝试将我的所有字段都上传为varchar(255),这太短了。我可以手动指定列,但我不想这样做。我希望它假设varchar(max),除非我另有说明。

我也尝试过

dbWriteTable(con,"r_test_upload2",result_csv, field.types = c(.default ="varchar(max)"))

,但它假定这是一个字段名,并失败,并显示以下内容:

错误:field.types中的列必须在输入中,缺少列: -'.default'

我还将考虑其他任何打包建议。

1 个答案:

答案 0 :(得分:1)

dbWriteTable函数是在每个驱动程序包(例如RSQLiteodbc)中单独实现的,因此答案在技术上取决于此……但我认为最终结果会是一样的:您将需要使用包装函数。

看看odbc包,我们发现dbWriteTable(实际上是odbc_write_table)仅在必须创建新表的情况下才使用field.types,对此表调用{ {3}}。调用sqlCreateTable,在此软件包中似乎对名称有严格的要求。

要做您想做的事,您可能需要包装函数:

my_dbWriteTable <- function(conn, name, value, ..., field.types = NULL) {
  cl <- match.call(expand.dots = TRUE)
  cl[[1]] <- substitute(dbWriteTable)
  if (!is.null(field.types) && ".default" %in% names(field.types)) {
    othernames <- setdiff(colnames(value), names(field.types))
    cl$field.types <- c(
      field.types[ setdiff(names(field.types), ".default") ],
      setNames(rep(field.types[".default"], length(othernames)), othernames)
    )
  }
  eval.parent(cl)
}

my_dbWriteTable(con, "quux", mtcars, field.types=c(cyl="integer", .default="varchar(max)"))
DBI::dbGetQuery(con, "select column_name, data_type from information_schema.columns where table_name='quux'")
#    column_name data_type
# 1    row_names   varchar
# 2          mpg   varchar
# 3          cyl       int
# 4         disp   varchar
# 5           hp   varchar
# 6         drat   varchar
# 7           wt   varchar
# 8         qsec   varchar
# 9           vs   varchar
# 10          am   varchar
# 11        gear   varchar
# 12        carb   varchar

(此方法假设在呼叫环境中可见/可以使用某种形式的dbWriteTable。)