是否可以使用dplyr包将一行插入(添加)到SQLite数据库表?

时间:2014-10-25 23:07:15

标签: r sqlite dplyr

我是dplyr包的数据库连接功能的新手,但我对将它用于SQLite连接非常感兴趣。我跟着this tutorial创建了一个SQLite数据库(my_db)

my_db <- src_sqlite("my_db.sqlite3", create = T)

并插入一个数据帧(df)作为此数据库的表(my_table)。

copy_to(my_db,df,"my_table")

现在我想在此表中插入新行。我试过这样的事情(是的,我必须承认它看起来没什么前途......但我还是试了一下):

collect(build_sql("INSERT INTO my_table VALUES (",newdf,")", con=my_db))

有没有人知道使用dplyr是否可以在现有的sqlite db表中添加行?或者您将如何处理这个问题?非常感谢提前!

4 个答案:

答案 0 :(得分:55)

不,您可以dplyr内完成此操作。

require(dplyr)

my_db <- src_sqlite( "my_db.sqlite3", create = TRUE)                 # create src
copy_to( my_db, iris, "my_table", temporary = FALSE)                 # create table
newdf = iris                                                         # create new data
db_insert_into( con = my_db$con, table = "my_table", values = newdf) # insert into

答案 1 :(得分:13)

this newsgroup。   哈德利解释了函数dplyr::copy_to()的目的。 它旨在创建临时测试表。 电子邮件交换以建议使用RMySQL::dbWriteTable()结束 将数据附加到现有表。这同样适用于SQLite数据库,如上面接受的答案中所述。

要附加与现有数据库表具有相同列名的数据框dtf,我使用了:

library(RMySQL)
DB <- dbConnect(MySQL(), user="usename", host="localhost",
                   password="***", dbname="dbname")
dbWriteTable(DB, "tablename", dtf, append=TRUE, row.names = FALSE)

答案 2 :(得分:9)

可以对通过dplyr创建的数据库/表执行SQL操作,但您必须恢复为RSQLite / DBI调用并更改您创建数据库/表的方式:

library(dplyr)

my_db <- src_sqlite("my_db.sqlite3", create=TRUE) 
copy_to(my_db, iris, "my_table", temporary=FALSE) # need to set temporary to FALSE

# grab the db connection from the object created by src_sqlite
# and issue the INSERT That way

res <- dbSendQuery(my_db$con, 
                   'INSERT INTO my_table VALUES (9.9, 9.9, 9.9, 9.9, "new")')

答案 3 :(得分:1)

我使用dplyr写入数据库的主要原因是我不希望在代码中间切换语言。对于您的问题,我认为最好的解决方案是使用db_insert_into()的{​​{1}}函数,如StatSandwich所示