我正在尝试使用以下行将数据帧写入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'
我还将考虑其他任何打包建议。
答案 0 :(得分:1)
dbWriteTable
函数是在每个驱动程序包(例如RSQLite
,odbc
)中单独实现的,因此答案在技术上取决于此……但我认为最终结果会是一样的:您将需要使用包装函数。
看看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
。)