代码之家  ›  专栏  ›  技术社区  ›  Dan

使用dplyr插入duckdb表

  •  0
  • Dan  · 技术社区  · 3 年前

    我正在与 在R中,并希望使用插入一条记录 dplyr 。下面我列举了一个我正在努力实现的目标的例子。

    首先,我加载我的库,创建一个玩具数据集,然后将其加载到数据库中。

    # Load libraries
    library(DBI)
    library(duckdb)
    library(dplyr)
    
    # Create database connection
    con <- dbConnect(duckdb(), 
                     dbdir="test.duckdb", 
                     read_only=FALSE)
    
    # Toy data frame
    df <- data.frame(a = 1:5,
                     b = letters[1:5],
                     c = runif(5))
    
    # Write data to table
    dbWriteTable(con, "foo", df)
    

    我现在可以使用SQL和 dplyr 语法:

    # Query          
    dbGetQuery(con, "SELECT * FROM foo")
    #   a b         c
    # 1 1 a 0.1407891
    # 2 2 b 0.8824569
    # 3 3 c 0.2863700
    # 4 4 d 0.9010191
    # 5 5 e 0.8676229
    
    tbl(con, "foo") %>% collect
    #   # A tibble: 5 x 3
    #       a b         c
    #   <int> <chr> <dbl>
    # 1     1 a     0.141
    # 2     2 b     0.882
    # 3     3 c     0.286
    # 4     4 d     0.901
    # 5     5 e     0.868
    

    我可以使用SQL语法插入一条记录:

    # Insert with SQL 
    dbExecute(con, 
              "INSERT INTO foo VALUES (?, ?, ?)", 
              list(6, "F", 0.5))
    dbGetQuery(con, "SELECT * FROM foo")
    
    #   a b         c
    # 1 1 a 0.1407891
    # 2 2 b 0.8824569
    # 3 3 c 0.2863700
    # 4 4 d 0.9010191
    # 5 5 e 0.8676229
    # 6 6 F 0.5000000
    

    好极了


    我的问题是,如何编写SQL插入语句,但使用 dplyr 语法?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Simon.S.A.    3 年前

    这几乎肯定是不可能的。

    请注意,一旦将其写入数据库, df 不是典型的(本地)数据帧,而是指向远程数据库表的本地指针。对于本地数据帧,dplyr命令可以更改表,例如:

    new_df = old_df %>% mutate(new_col = old_col * 2)
    

    但是数据库被设计成不能以同样的方式进行修改。如果你要跑步

    remote_df = tbl(con, "table_name")
    new_remote_df = remote_df %>% mutate(new_col = old_col * 2)
    

    代替创建新的数据库表, new_remote_df 是从原始数据库表中读取并构造 new_col 动态/按需。

    因此,对于远程数据库表,dplyr不允许您更改底层表,它只会更改表的显示方式。

    这意味着,如果要修改数据库,则需要使用特定于数据库的命令(例如 INSERT INTO )。

    推荐文章