我是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表中添加行?或者您将如何处理这个问题?非常感谢提前!
答案 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所示