你能帮我吗?告诉我错误在哪里。我正在尝试从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
1条答案
按热度按时间rekjcdws1#
首先,问题中的代码可以减少到更少的行,因为大部分代码都是“试图找到包”。我将处理这部分相关的代码:
虽然输出本身是相当不言自明的(
character(0)
表示数据库/文件中没有用户表),但“为什么”的原因可能并不直观,虽然我们不确定,但有一个相当可信的原因可以解释为什么您会遇到这种情况:文件不在R的当前工作目录中。
我认为知道SQLite是唯一的“数据库类型”(当然,duckdb也是)是很有启发性的,当你连接时,如果文件还不存在,它会被创建为一个空数据库。事后看来,特别是对于该包的新用户,当这是一个新文件并因此不存在表时,对
dbConnect
的RSQLite
实现具有一个出错(或至少警告)用户的create=FALSE
选项可能是有益的。后见之明是20/20,如果你在试图打开它之前检查文件是否存在,你可能会发现它不存在,这意味着你应该先找到它。例如,这可能是你本来会看到的(但现在不会看到,原因我一会儿会说):
它现在可能返回
TRUE
的原因是,连接到一个不存在的文件,正如我前面所说的,它默认创建一个新的(空的)文件,但是,如果您没有对这个数据库连接做任何操作(特别是将任何数据插入任何表),那么您可能会发现这是真的:具体来说,
size
是0
,表示文件是空的(空的SQLite数据库是真正的零长度文件,尽管当您添加任何内容时,对于标准的SQLite管理表等,它会增长很多)。最后,这种情况下的问题(我猜)是您在一个目录中查看
"test.db"
(或者从浏览器下载目录复制到那里),但是您的R在另一个目录中运行。也许可以尝试将其与保存
"test.db"
的实际目录关联起来。例如,可以使用以下方法之一: