如何从 SQLite 数据库中读取所有表并在 R 中存储为 datasets/variables?

How to read all tables from a SQLite database and store as datasets/variables in R?

我有一个包含许多表的大型 SQLite 数据库。我已经使用 RSQLite 和 DBI 包在 RStudio 中建立了到这个数据库的连接。 (我将这个数据库命名为db

library(RSQLite)
library(DBI)

目前我必须读入所有表格并手动为它们分配一个名称。例如:

country <- dbReadTable(db, "country")
date <- dbReadTable(db, "date")
#...and so on

您可以看到,如果您有很多表,这可能是一个非常耗时的过程。

所以我想知道是否可以创建一个新函数或使用现有函数(例如 lapply()?)来更有效地完成此操作并从根本上加快此过程?

非常感谢任何建议:)

您可以使用 dbListTables() 生成 SQLite 数据库中所有 table 名称的字符向量,并使用 lapply() 将它们高效地导入 R。我会首先检查您是否能够将数据库中的所有 table 导入内存。

下面是一个可重现的例子:

library(RSQLite)
library(DBI)

db <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(db, "mtcars", mtcars)
dbWriteTable(db, "iris", iris)
db_tbls <- dbListTables(db)

tbl_list <- lapply(db_tbls, dbReadTable, conn = db)
tbl_list <- setNames(tbl_list, db_tbls)

dbDisconnect(db)

> lapply(tbl_list, head)
$iris
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

$mtcars
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

两种心态:

  1. 所有 tables/data 到一个命名列表中:

    alldat <- lapply(setNames(nm = dbListTables(db)), dbReadTable, conn = db)
    

    这样做的好处是,如果表格具有相似的含义,那么您可以使用 lapply 对每个表格应用相同的功能。另一个好处是来自一个数据库的所有数据都存储在一起。

    有关处理帧列表的信息,请参阅 How do I make a list of data frames?

  2. 如果你想让它们作为全局(或封闭)环境中的实际变量,那么取前面的alldat,和

    ign <- list2env(alldat, envir = .GlobalEnv)
    

    来自 list2env 的 return 值是我们传递给 list2env 的环境,因此它在这种情况下并不是非常有用(尽管它在其他时候很有用)。我将其捕获到 ign 中的唯一原因是减少控制台上的混乱……这是次要的。 list2env 主要产生副作用,因此在这种情况下 return 值并不重要。