将列添加到sqlite数据库
Adding column to sqlite database
我正在尝试将我在 R 中生成的矢量作为新列添加到 sqlite table。为此,我想使用 dplyr
(我根据此 post here 安装了最新的开发版本以及 dbplyr
软件包)。我尝试了什么:
library(dplyr)
library(DBI)
#creating initial database and table
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
cars_tbl <- dplyr::tbl(dbcon, "cars")
#new values which I want to add as a new column
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
#attempt to add new values as column to the table in the database
cars_tbl %>% mutate(new_col = new_values) #not working
实现此目的的简单方法是什么(不一定使用 dplyr)?
不知道使用 dyplr
执行此操作的方法,但您可以直接使用 RSQLite
执行此操作。问题实际上不是 RSQLite
,而是我不知道如何将列表传递给 mutate
。请注意,在您的代码中,类似这样的事情会起作用:
cars_tbl %>% mutate(new_col = another_column / 3.14)
无论如何,我的选择。我创建了一个玩具 cars
数据框。
cars <- data.frame(year=c(1999, 2007, 2009, 2017), model=c("Ford", "Toyota", "Toyota", "BMW"))
我打开连接并实际创建 table,
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
添加新列并检查,
dbGetQuery(dbcon, "ALTER TABLE cars ADD COLUMN new_col TEXT")
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford <NA>
2 2007 Toyota <NA>
3 2009 Toyota <NA>
4 2017 BMW <NA>
然后你可以更新新列,但唯一棘手的是你必须提供一个 where
声明,在这种情况下我使用年份。
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
new_values
[1] "C" "B" "B" "B"
dbGetPreparedQuery(dbcon, "UPDATE cars SET new_col = ? where year=?",
bind.data=data.frame(new_col=new_values,
year=cars$year))
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford C
2 2007 Toyota B
3 2009 Toyota B
4 2017 BMW B
作为唯一索引,您始终可以使用 rownames(cars)
,但您必须将其作为列添加到您的数据框中,然后再添加到您的 table.
根据@krlmlr的建议进行编辑:使用dbExecute
确实比弃用dbGetPreparedQuery
、
要好得多
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where year = :year",
params=data.frame(new_col=new_values,
year=cars$year))
评论后编辑:我几天前没想过这个,但即使是 SQLite
你也可以使用 rowid
.我已经对此进行了测试并且有效。
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where rowid = :id",
params=data.frame(new_col=new_values,
id=rownames(cars)))
尽管您必须确保 table 中的 rowid 与您的行名相同。不管怎样,你总能得到这样的 rowid:
dbGetQuery(dbcon, "SELECT rowid, * FROM cars")
rowid year model new_col
1 1 1999 Ford C
2 2 2007 Toyota B
3 3 2009 Toyota B
4 4 2017 BMW B
我正在尝试将我在 R 中生成的矢量作为新列添加到 sqlite table。为此,我想使用 dplyr
(我根据此 post here 安装了最新的开发版本以及 dbplyr
软件包)。我尝试了什么:
library(dplyr)
library(DBI)
#creating initial database and table
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
cars_tbl <- dplyr::tbl(dbcon, "cars")
#new values which I want to add as a new column
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
#attempt to add new values as column to the table in the database
cars_tbl %>% mutate(new_col = new_values) #not working
实现此目的的简单方法是什么(不一定使用 dplyr)?
不知道使用 dyplr
执行此操作的方法,但您可以直接使用 RSQLite
执行此操作。问题实际上不是 RSQLite
,而是我不知道如何将列表传递给 mutate
。请注意,在您的代码中,类似这样的事情会起作用:
cars_tbl %>% mutate(new_col = another_column / 3.14)
无论如何,我的选择。我创建了一个玩具 cars
数据框。
cars <- data.frame(year=c(1999, 2007, 2009, 2017), model=c("Ford", "Toyota", "Toyota", "BMW"))
我打开连接并实际创建 table,
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
添加新列并检查,
dbGetQuery(dbcon, "ALTER TABLE cars ADD COLUMN new_col TEXT")
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford <NA>
2 2007 Toyota <NA>
3 2009 Toyota <NA>
4 2017 BMW <NA>
然后你可以更新新列,但唯一棘手的是你必须提供一个 where
声明,在这种情况下我使用年份。
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
new_values
[1] "C" "B" "B" "B"
dbGetPreparedQuery(dbcon, "UPDATE cars SET new_col = ? where year=?",
bind.data=data.frame(new_col=new_values,
year=cars$year))
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford C
2 2007 Toyota B
3 2009 Toyota B
4 2017 BMW B
作为唯一索引,您始终可以使用 rownames(cars)
,但您必须将其作为列添加到您的数据框中,然后再添加到您的 table.
根据@krlmlr的建议进行编辑:使用dbExecute
确实比弃用dbGetPreparedQuery
、
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where year = :year",
params=data.frame(new_col=new_values,
year=cars$year))
评论后编辑:我几天前没想过这个,但即使是 SQLite
你也可以使用 rowid
.我已经对此进行了测试并且有效。
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where rowid = :id",
params=data.frame(new_col=new_values,
id=rownames(cars)))
尽管您必须确保 table 中的 rowid 与您的行名相同。不管怎样,你总能得到这样的 rowid:
dbGetQuery(dbcon, "SELECT rowid, * FROM cars")
rowid year model new_col
1 1 1999 Ford C
2 2 2007 Toyota B
3 3 2009 Toyota B
4 4 2017 BMW B