Я столкнулся с подобной проблемой и разработал следующую работу вокруг. Это ядро функции, которую я использую для записи таблиц R в базу данных (полную функцию можно найти в моем репозитории dbplyr helpers ). Эта урезанная версия предполагает, что таблица, в которую вы пишете, уже существует.
copy_r_to_sql = function(db_connection, schema, sql_table_name, r_table,
named_list_of_columns){
# trim r table to just variables of interest
r_table = r_table %>%
select(names(named_list_of_columns))
# if column type is character or date, wrap in single quotes
# so SQL reads it as character string
for(coln in colnames(r_table)){
col_type = named_list_of_columns[[coln]]
of(grepl("char", col_type) | grepl("date", col_type))
r_table[coln] = apply(r_table[coln], 1, function(x) paste0("'", as.character(x), "'"))
}
# SQL
sql_cols = paste0("([",paste0(names(named_list_of_columns), collapse = "],["), "])")
sql_values = paste0(apply(r_table, 1,
function(x) paste0("(", paste0(x, collapse = ","),")")),
collapse = ",\n")
my_sql = build_sql(con = db_connection,
"INSERT INTO ", sql(schema), ".",sql(sql_table_name),"\n",
sql(sql_cols), "\n",
"VALUES ", sql(sql_values),";")
result = dbExecute(db_connection, as.character(my_sql))
}
Функция предназначена для записи текста SQL, который добавит указанные строки в вашу таблицу. Чтобы понять, что делает функция, вы можете заменить последнюю строку dbExecute
на оператор печати.
В качестве примера вызова функции:
named_list_of_columns = list(Sepal.Length = "[float](5,1) NOT NULL",
Sepal.Width = "[float](5,1) NOT NULL",
Species = "[varchar](15) NOT NULL")
copy_r_to_sql(con, "DB_NAME.SCHEMA", "newTblIris", iris, named_list_of_columns)
Я не пробовал использовать это для больших таблиц. Если вам нужно загрузить большое количество строк, я рекомендую создать новую таблицу и добавить ее в пакетном режиме.