R不从SQLite读取表

p3rjfoxz  于 2023-01-18  发布在  SQLite
关注(0)|答案(1)|浏览(158)

你能帮我吗?告诉我错误在哪里。我正在尝试从SQLite拉表到R。一开始他没有读DB,后来他打开了,但他还是没有看到表。

> 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
rekjcdws

rekjcdws1#

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

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

虽然输出本身是相当不言自明的(character(0)表示数据库/文件中没有用户表),但“为什么”的原因可能并不直观,虽然我们不确定,但有一个相当可信的原因可以解释为什么您会遇到这种情况:

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

我认为知道SQLite是唯一的“数据库类型”(当然,duckdb也是)是很有启发性的,当你连接时,如果文件还不存在,它会被创建为一个空数据库。事后看来,特别是对于该包的新用户,当这是一个新文件并因此不存在表时,对dbConnectRSQLite实现具有一个出错(或至少警告)用户的create=FALSE选项可能是有益的。
后见之明是20/20,如果你在试图打开它之前检查文件是否存在,你可能会发现它不存在,这意味着你应该先找到它。例如,这可能是你本来会看到的(但现在不会看到,原因我一会儿会说):

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

它现在可能返回TRUE的原因是,连接到一个不存在的文件,正如我前面所说的,它默认创建一个新的(空的)文件,但是,如果您没有对这个数据库连接做任何操作(特别是将任何数据插入任何表),那么您可能会发现这是真的:

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数据库是真正的零长度文件,尽管当您添加任何内容时,对于标准的SQLite管理表等,它会增长很多)。
最后,这种情况下的问题(我猜)是您在一个目录中查看"test.db"(或者从浏览器下载目录复制到那里),但是您的R在另一个目录中运行。

getwd()
# [1] "C:/Users/r2/StackOverflow"

也许可以尝试将其与保存"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

相关问题