在R中使用dtr将行从tibble转换到SQLite数据库:“auto_copy()”不同对象类的错误

zzwlnbp8  于 5个月前  发布在  SQLite
关注(0)|答案(1)|浏览(59)

我尝试将一个函数循环应用到R中的一个文件路径列表,目的是将输出附加到一个内存不足的SQLite数据库中,该数据库当前为空,并且具有预定义的结构。
下面是数据库结构(我不知道如何为数据库连接创建适当的reprex)

database
# Source:   table<epi_table> [0 x 14]
# Database: sqlite 3.44.2 [/home/me/repositories/some_path/data/some_path.db]
# ℹ 14 variables: doc_index <int>, content_type <chr>, style_name <chr>, text <chr>, level <dbl>,
#   num_id <int>, row_id <int>, is_header <int>, cell_id <dbl>, col_span <dbl>, row_span <int>,
#   successful_import <int>, filepath <chr>, doc_vs_docx <chr>

字符串
我对文件路径列表执行的函数loop-apply在每次迭代中都产生如下输出:

new_row <- structure(list(doc_index = 1L, content_type = "paragraph", style_name = NA_character_, 
    text = "Some_text", level = NA_real_, num_id = NA_integer_, 
    row_id = NA_integer_, is_header = NA, cell_id = NA_real_, 
    col_span = NA_real_, row_span = NA_integer_, successful_import = TRUE, 
    filepath = "some_file.docx", doc_vs_docx = "docx"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

new_row
# A tibble: 1 × 14
  doc_index content_type style_name text      level num_id row_id is_header cell_id col_span row_span successful_import filepath       doc_vs_docx
      <int> <chr>        <chr>      <chr>     <dbl>  <int>  <int> <lgl>       <dbl>    <dbl>    <int> <lgl>             <chr>          <chr>      
1         1 paragraph    NA         Some_text    NA     NA     NA NA             NA       NA       NA TRUE              some_file.docx docx


我尝试使用以下代码将行插入数据库:

database |> rows_insert(new_rows, conflict = 'ignore')


但是,我遇到了一个关于不同对象类的错误:

Error in `auto_copy()`:
! `x` and `y` must share the same src.
ℹ `x` is a <tbl_SQLiteConnection/tbl_dbi/tbl_sql/tbl_lazy/tbl> object.
ℹ `y` is a <tbl_df/tbl/data.frame> object.
ℹ Set `copy = TRUE` if `y` can be copied to the same source as `x` (may be slow).


如果我打算将常规的tibble行添加到tbl对象中,我需要事先将其转换为tbl对象吗?对于这个特定的用例,dbblob不是很有用吗?我现在对学习正确的SQL脚本没有太大兴趣,并且总是依赖dbblob。
标签:Is it possible to insert (add) a row to a SQLite db table using dplyr package?

sshcrbum

sshcrbum1#

我最终明白了DBI::dbWriteTable是如此简单和高效,我们不应该去别处寻找。
虽然dbplyr可以是任何反对SQL的人的首选,但它通常被推荐作为数据分析工具,并且有一些强烈的意见反对使用该软件包来操作/编辑数据库请参阅Hadley的批评in a comment here和这里。
我发现很多评论建议我们使用DBI包。我设法通过简单地使用DBI::dbWriteTable()添加行,如下所示:

dbWriteTable(con, "epi_table", new_row, append = TRUE, row.names = FALSE)

字符串
现在我甚至可以继续使用dbplyr来查询collect(database)更新后的表

相关问题