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 也是...)是很有启发性的,当您连接时,如果该文件尚不存在,将为您创建它作为一个空数据库。更令人恼火的是,它是完全默默地做这件事的;事后看来,特别是对于该软件包的新用户而言,为 RSQLite
的 dbConnect
实现提供一个 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
具体来说,size
为0
,表示该文件为空。 (空的 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
你能帮帮我吗?告诉我错误在哪里。我正在尝试将 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 也是...)是很有启发性的,当您连接时,如果该文件尚不存在,将为您创建它作为一个空数据库。更令人恼火的是,它是完全默默地做这件事的;事后看来,特别是对于该软件包的新用户而言,为 RSQLite
的 dbConnect
实现提供一个 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
具体来说,size
为0
,表示该文件为空。 (空的 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