#r #database #sqlite #rsqlite
#r #База данных #sqlite #rsqlite
Вопрос:
Можете ли вы мне помочь? Скажите мне, где ошибка. Я пытаюсь извлечь таблицы из 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. Пакет
SQLite
не установлен. Пожалуйстаinstall.package("SQLite")
, установите его перед загрузкой.2. @hannes101 В CRAN нет пакета с именем SQLite. Правильным пакетом является RSQLite, и он установлен, поскольку его загрузка не выдает ошибок. Проблема в том, что таблица ‘name’ не существует в базе данных ‘test.db’.
3. @neilfws Я только что просмотрел первую ошибку в коде, но это
Error: Couldn't find driver RSQLite. Looked in:...
тоже не проблема?4. В этом коде происходит много проб и ошибок 🙂 но я думаю, что важно то, что в конечном итоге правильная библиотека загружается (RSQLite) без ошибок, и соединение устанавливается без ошибок. Проблема, по-видимому, заключается в том, что именованной таблицы нет в базе данных.
5. @neilfws да, в начале были ошибки. но в итоге все сработало, кроме чтения таблицы. но он определенно существует.
Ответ №1:
Во-первых, код в вопросе может быть сокращен до гораздо меньшего количества строк, поскольку большая его часть «пытается найти пакет». Я буду работать с этим соответствующим подмножеством кода:
con <- dbConnect(drv, dbname= 'test.db')
dbListTables(con)
# character(0)
dbReadTable(con, 'name')
# Error: no such table: name
Хотя сам вывод достаточно понятен ( character(0)
указывает, что в базе данных / файле нет пользовательских таблиц), причина «почему», возможно, неинтуитивна. Хотя мы не знаем наверняка, есть одна вполне правдоподобная причина, по которой я думаю, что это происходит с вами:
Файл не находится в текущем рабочем каталоге R.
Я думаю, полезно знать, что SQLite — это единственный «тип базы данных» (ну, и duckdb …), Который при подключении, если файл еще не существует, будет создан для вас как пустая база данных. Еще более досадно, что он делает это совершенно бесшумно; оглядываясь назад, особенно для новых пользователей пакета, было бы полезно иметь create=FALSE
возможность RSQLite
реализовать dbConnect
эти ошибки (или, по крайней мере, предупреждает) пользователя, когда это новый файл и, следовательно, таблиц не существует.
Ретроспективно 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
В частности, size
это 0
означает, что файл пуст. (Пустые базы данных 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