在R中使用SQLite进行简单数据库管理

2022-04-14 13:20:36 浏览数 (1)

学习如何在R中使用SQLite,这是一种非常轻量级的关系数据库管理系统(RDBMS)。

创建数据库和表

第一步是创建数据库。使用dbConnect()函数为mtcars数据集创建一个适当的数据库。

代码语言:javascript复制
# Load the RSQLite Library
library(RSQLite)
# Load the mtcars as an R data frame put the row names as a column.
data("mtcars")
mtcars$car_names <- rownames(mtcars)
rownames(mtcars) <- c()
head(mtcars)
# Create a connection to our new database, CarsDB.db
# you can check that the .db file has been created on your working directory
conn <- dbConnect(RSQLite::SQLite(), "CarsDB.db")

一旦创建了数据库,就可以继续使用dbWriteTable()函数在数据库中创建一个表。这个函数可以接受多个参数:

conn:连接到你的SQLite数据库 name:您想要用于表的名称 value:插入的数据

之后,可以使用函数dbListTables()和SQLite数据库连接作为参数,检查是否已经成功创建了表。

代码语言:javascript复制
# Write the mtcars dataset into a table names mtcars_data
dbWriteTable(conn, "cars_data", mtcars)
# List all the tables available in the database
dbListTables(conn)
##'cars_data'

如果你有多个数据,可以通过在dbWriteTable()中设置可选参数append = TRUE,在已有的表中添加更多的数据。例如,可以通过添加两个不同的数据来创建一个新的表,其中包含一些汽车和制造商。

代码语言:javascript复制
# Create toy data frames
car <- c('Camaro', 'California', 'Mustang', 'Explorer')
make <- c('Chevrolet','Ferrari','Ford','Ford')
df1 <- data.frame(car,make)
car <- c('Corolla', 'Lancer', 'Sportage', 'XE')
make <- c('Toyota','Mitsubishi','Kia','Jaguar')
df2 <- data.frame(car,make)
# Add them to a list
dfList <- list(df1,df2)
# Write a table by appending the data frames inside the list
for(k in 1:length(dfList)){
    dbWriteTable(conn,"Cars_and_Makes", dfList[[k]], append = TRUE)
}
# List all the Tables
dbListTables(conn)
##"Cars_and_Makes" "cars_data"

确保所有数据都在新表中

代码语言:javascript复制
dbGetQuery(conn, "SELECT * FROM Cars_and_Makes")

car

make

Camaro

Chevrolet

California

Ferrari

Mustang

Ford

Explorer

Ford

Corolla

Toyota

Lancer

Mitsubishi

Sportage

Kia

XE

Jaguar

执行SQL查询

可以使用dbGetQuery()执行有效的SQL查询,该函数有以下参数:

conn:连接SQLite数据库 query:执行的SQL查询

NOTE:通过RSQLIte,可以执行任何查询,从简单的SELECT语句到JOINS(除了RIGHT OUTER JOINS和FULL OUTER JOINS,这是在SQLite中不支持的)。

代码语言:javascript复制
# Gather the first 5 rows in the cars_data table
dbGetQuery(conn, "SELECT * FROM cars_data LIMIT 5")
代码语言:javascript复制
# Get the car names and horsepower starting with M that have 6 or 8 cylinders
dbGetQuery(conn,"SELECT car_names, hp, cyl FROM cars_data
                 WHERE car_names LIKE 'M%' AND cyl IN (6,8)")

car_names

hp

cyl

Mazda RX4

110

6

Mazda RX4 Wag

110

6

Merc 280

123

6

Merc 280C

123

6

Merc 450SE

180

8

Merc 450SL

180

8

Merc 450SLC

180

8

Maserati Bora

335

8

要将查询的结果存储,以便在R中继续执行进一步的操作,只需将查询的结果赋值给一个变量即可。

代码语言:javascript复制
avg_HpCyl <- dbGetQuery(conn,"SELECT cyl, AVG(hp) AS 'average_hp'FROM cars_data
                 GROUP BY cyl
                 ORDER BY average_hp")
avg_HpCyl

加入变量查询

从R操作SQLite数据库的最大优点之一是能够使用参数化查询。也就是说,能够使用R工作空间中可用的变量查询SQLite数据库。

代码语言:javascript复制
# Lets assume that there is some user input that asks us to look only into cars that have over 18 miles per gallon (mpg)
# and more than 6 cylinders
mpg <-  18
cyl <- 6
Result <- dbGetQuery(conn, 'SELECT car_names, mpg, cyl FROM cars_data WHERE mpg >= ? AND cyl >= ?', params = c(mpg,cyl))
Result

car_names

mpg

cyl

Mazda RX4

21.0

6

Mazda RX4 Wag

21.0

6

Hornet 4 Drive

21.4

6

Hornet Sportabout

18.7

8

Valiant

18.1

6

Merc 280

19.2

6

Pontiac Firebird

19.2

8

Ferrari Dino

19.7

6

不返回表格数据的查询

可能希望执行不一定返回表格数据的SQL查询。这些操作的例子包括插入、更新或删除表记录。为此,我们可以使用函数dbExecute(),它以一个SQLite数据库连接和一个SQL查询作为参数。

代码语言:javascript复制
# Visualize the table before deletion
dbGetQuery(conn, "SELECT * FROM cars_data LIMIT 10")
# Delete the column belonging to the Mazda RX4.
dbExecute(conn, "DELETE FROM cars_data WHERE car_names = 'Mazda RX4'")
# Visualize the new table after deletion
dbGetQuery(conn, "SELECT * FROM cars_data LIMIT 10")

关闭

在R中完成了SQLite数据库的操作,调用函数dbDisconnect()是很重要的。这确保释放了数据库连接一直在使用的资源。

代码语言:javascript复制
# Close the database connection to CarsDB
dbDisconnect(conn)

0 人点赞