R 不从 SQLite 中读取表

R does not read tables from SQLite

你能帮帮我吗?告诉我错误在哪里。我正在尝试将 tables 从 SQLite 拉到 R。开始时,他没有读取 DB,但后来打开它,但他仍然没有看到 table。

    > library('RSQLite')
    > require(SQLite)
    Loading required package: SQLite
    Warning message:
    In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
      there is no package called ‘SQLite’
    > drv <- dbDriver("SQLite") 
    > require('RSQLite')
    > dvr <- dbDriver('RSQLite')
    Error: Couldn't find driver RSQLite. Looked in:
    * global namespace
    * in package called RSQLite
    * in package called RRSQLite
    > View(drv)
    > con <- dbConnect(drv, dbname= 'test.db')
    > dbListTables(con)
    character(0)
    > dbReadTable(con, 'name')
    Error: no such table: name

首先,问题中的代码可以减少很多行,因为其中大部分是“试图找到包”。我将处理这个相关的代码子集:

con <- dbConnect(drv, dbname= 'test.db')
dbListTables(con)
# character(0)
dbReadTable(con, 'name')
# Error: no such table: name

虽然输出本身相当 self-explanatory(character(0) 表示 database/file 中没有用户表),但“为什么”的原因可能不直观。虽然我们不确定,但我认为这会发生在你身上有一个非常可信的原因:

该文件不在 R 的当前工作目录中。

我认为知道 SQLite 是唯一的“数据库类型”(好吧,duckdb 也是...)是很有启发性的,当您连接时,如果该文件尚不存在,将为您创建它作为一个空数据库。更令人恼火的是,它是完全默默地做这件事的;事后看来,特别是对于该软件包的新用户而言,为 RSQLitedbConnect 实现提供一个 create=FALSE 选项可能会提供一些信息,该选项会在以下情况下错误(或至少警告)用户这是一个新文件,因此不存在表格。

事后看来是20/20,如果你在file-existence 尝试打开它之前检查过它,你可能会发现它不存在,建议你应该先找到它。例如,这可能是你会看到的(但现在不会看到,原因我稍后会说):

file.exists("test.db")
# [1] FALSE

它现在可能 return TRUE 的原因是,通过连接到 non-existent 文件,正如我之前所说,它默认创建一个新的(空)文件。但是,如果您对该数据库连接没有做任何其他事情(特别是将任何数据插入任何表),那么您可能会发现这是真的:

file.info("test.db")
#        size isdir mode               mtime               ctime               atime
# test.db    0 FALSE  666 2020-11-05 15:53:21 2020-11-05 15:53:21 2020-11-05 15:53:21
#         exe
# test.db  no

具体来说,size0,表示该文件为空。 (空的 SQLite 数据库是真正的 zero-length 文件,尽管当你添加任何东西时它会为标准的 SQLite 管理表等增长很多。)

最终,这种情况下的问题(我猜)是您正在一个目录中查看 "test.db"(或从浏览器下载目录复制到那里),但您的 R 是 运行 在不同的目录中。虽然这个答案不是解决有关工作目录问题的最佳位置,但您可以通过

找到一些信息
getwd()
# [1] "C:/Users/r2/Whosebug"

也许会尝试将其与您保存 "test.db" 的实际目录相关联。例如,可以使用以下之一:

con <- dbConnect(drv, dbname= 'path/to/test.db')        # relative to this directory
con <- dbConnect(drv, dbname= '../../path/to/test.db')  # also relative, but not "below"
con <- dbConnect(drv, dbname= '/path/to/test.db')       # absolute path to that file