创建一个 SQLite 数据库

时间:2022-07-20 03:26:53

首先,我们学习如何创建一个SQLite 数据库。如果想要在data/example.sqlite 这个
路径中创建一个示例数据库,就必须确保该路径存在。如果该路径不存在,就必须先创建路径:
if (!dir.exists("data")) dir.create("data")
现在,路径 data/ 是可访问的了。接下来,我们载入 RSQLite 扩展包,并提供一个
数据库驱动(SQLite( ))和数据库文件(data/example.sqlite)来建立连接。尽
管目标文件尚不存在,数据库驱动会创建一个空文件,即一个空的 SQLite 数据库:
library(RSQLite)
##装载相关扩展包:DBI
con <- dbConnect(SQLite( ), "data/example.sqlite")
数据库连接 con 是介于用户和系统中间的一层。我们可以创建一个连接,并且连接到
关系型数据库,并通过这个连接实现查询、抽取及更新数据。后续的操作中一直使用该连
接,直到连接被关闭。在一个典型的关系型数据库中,我们可以创建一个新表,该表的名
11.1 操作关系型数据库 321
称、列的名称和数据类型都是事先确定的,并且可以在表中增加行记录,也可以更新现有
记录。关系型数据中的一张表看起来非常像 R 里的数据框。
现在,我们将创建一个简单的数据框,并将它作为一张表插入到数据库中。
example1 <- data.frame(
id=1:5,
type = c("A", "A", "B", "B", "C"),
score = c(8, 9, 8, 10, 9),
stringsAsFactors = FALSE)
example1
## id type score
## 1 1 A 8
## 2 2 A 9
## 3 3 B 8
## 4 4 B 10
## 5 5 C 9
现在,数据框已经准备好了,然后调用 dbWriteTable( ) 将其写入数据库,作为库
中的一张表:
dbWriteTable(con, "example1", example1)
## [1] TRUE
在 上 面 的代 码 中 , 我 们 也 可 以 使 用 其 他 表 名 来 存 储 同 样 的 数 据 。 最 后 ,
用 dbDisconnect( ) 断开数据库连接,这样 con 便不可用了。
dbDisconnect(con)
## [1] TRUE
1.向一个数据库写入多张表格
一个 SQLite 数据库是一个表的集合。因此,我们可以在数据库中存储多张表。
这次,我们将 ggplot2 中的 diamonds 数据集和 flights 中的 nycflights13 数
据集作为两张表格写入到一个数据库中。如果你还没有安装这两个包,请运行下列代码:
install.packages(c("ggplot2", "nycflights13"))
安装好两个扩展包之后,就可以调用 data( ) 来载入所需数据框:
data("diamonds", package = "ggplot2")
data("flights", package = "nycflights13")
我们重复之前的操作,但 dbWriteTable( ) 却报错了:
con <- dbConnect(SQLite( ), "data/datasets.sqlite")
dbWriteTable(con, "diamonds", diamonds, row.names=FALSE)
## Error in (function (classes, fdef, mtable) : unable to find an inherited
method for function 'dbWriteTable' for signature '"SQLiteConnection",
"character", "tbl_df"'
dbWriteTable(con, "flights", flights, row.names=FALSE)
## Error in (function (classes, fdef, mtable) : unable to find an inherited
method for function 'dbWriteTable' for signature '"SQLiteConnection",
"character", "tbl_df"'
dbDisconnect(con)
## [1] TRUE
此时,检查一下这两个变量的类,可能会有所帮助:
class(diamonds)
## [1] "tbl_df" "tbl" "data.frame"
class(flights)
## [1] "tbl_df" "tbl" "data.frame"
注意,diamonds 和 flights 不仅仅是一般的 data.frame 类型,而是更复杂的数
据结构。要将它们写入数据库,需要用 as.data.frame( ) 将其转化成普通的数据框对象。
con <- dbConnect(SQLite( ), "data/datasets.sqlite")
dbWriteTable(con, "diamonds", as.data.frame(diamonds), row.names = FALSE)
## [1] TRUE
dbWriteTable(con, "flights", as.data.frame(flights), row.names = FALSE)
## [1] TRUE
dbDisconnect(con)
## [1] TRUE
现在,数据库中就有这两张表了。
2.向表中追加数据
在本节的开头我们提到,向数据库的表中追加记录是非常容易的。这里有一个简单的
例子,首先生成几个数据块,然后将它们依次追加到数据库的表中:
con <- dbConnect(SQLite( ), "data/example2.sqlite")
chunk_size <- 10
id <- 0
for(i in 1:6) {
chunk <- data.frame(id = ((i-1L) * chunk_size):(i * chunk_size-1L),
type = LETTERS[[i]],
score = rbinom(chunk_size, 10, (10-i)/10),
stringsAsFactors = FALSE)
dbWriteTable(con, "products", chunk,
append = i > 1, row.names = FALSE)
}
dbDisconnect(con)
## [1] TRUE
注意,每次代码块都生成了一个数据框,其中包含一些确定数据和一些随机数,我们
将这些数据记录追加到一个名为 products 的表中。这个例子与之前例子的不同之处在
于,当调用 dbWriteTable( ) 时,在第 1 次循环中令参数 append = FALSE,以便
在数据库中创建表格,而后面的每次循环中要令 append = TRUE 来扩展已有的表格。