R не считывает таблицы из SQLite

#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