1

我有大约 250 个 csv 文件要加载到 SQLite 数据库中。我已将所有 csv 作为数据框加载到我的全局环境中。我正在使用以下函数将它们全部复制到 db 但得到Error: df must be local dataframe or a remote tbl_sql

library(DBI)
library(odbc)
library(rstudioapi)
library(tidyverse)
library(dbplyr)
library(RSQLite)
library(dm)


# Create DB Instance ---------------------------------------------

my_db <- dbConnect(RSQLite::SQLite(), "test_db.sqlite", create = TRUE)

# Load all csv files ---------------------------------------------

filenames <- list.files(pattern = ".*csv")
names <- substr(filenames, 1, nchar(filenames)-4)

for (i in names) {
  filepath <- file.path(paste(i, ".csv", sep = ""))
  assign(i, read.csv(filepath, sep = ",")) 
}

# Get list of data.frames ----------------------------------------

tables <- as.data.frame(sapply(mget(ls(), .GlobalEnv), is.data.frame))

colnames(tables) <- "is_data_frame"

tables <- tables %>% 
  filter(is_data_frame == "TRUE")

table_list <- row.names(tables)

# Copy dataframes to db ------------------------------------------
for (j in table_list) {
  copy_to(my_db, j)
}
4

1 回答 1

1

我使用copy_to. 我推荐dbWriteTableDBI 包中的命令。下面的示例代码:

DBI::dbWriteTable(
    db_connection,
    DBI::Id(
        catalog = db_name,
        schema = schema_name,
        table = table_name
    ),
    r_table_name
)

这将取代您的copy_to命令。您需要提供一个字符串来命名表,但数据库和模式名称可能是可选的,并且可能会被省略。

于 2021-08-05T03:42:56.070 回答