Как узнать общие имена столбцов из загруженного файла .sql с помощью RSQLite

У меня есть файл .sql, который я пытаюсь прочитать в базе данных SQL с помощью пакета R RSQLite. Чтобы ознакомиться, я сначала посмотрел на mtcars набора данных R:

mydb <- dbConnect(RSQLite::SQLite(), "")
dbWriteTable(mydb, "mtcars", mtcars)
str(mydb)

Структура следующая:

Formal class 'SQLiteConnection' [package "RSQLite"] with 5 slots
  ..@ Id                 :<externalptr> 
  ..@ dbname             : chr ""
  ..@ loadable.extensions: logi TRUE
  ..@ flags              : int 6
  ..@ vfs                : chr ""

Далее я просто читаю пять строк из базы данных:

dbGetQuery (mydb, 'ВЫБРАТЬ * ИЗ ПРЕДЕЛ 5 mtcars')

          row_names  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2     Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3        Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4    Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

Теперь я вижу имена столбцов, и, возможно, меня интересует только hp> 200, поэтому я и делаю:

dbGetQuery(mydb, 'SELECT * FROM mtcars WHERE hp > 200')
            row_names  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1          Duster 360 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
2  Cadillac Fleetwood 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
3 Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
4   Chrysler Imperial 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
5          Camaro Z28 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
6      Ford Pantera L 15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
7       Maserati Bora 15.0   8  301 335 3.54 3.570 14.60  0  1    5    8

Теперь я на самом деле пытаюсь просмотреть интересующие меня данные (больше не mtcars), называемые myData.sql. Мне сказали, что этот файл является общим SQL, и что я могу загрузить любую базу данных, которую я предпочитаю, и что он получен из PostgreSQL.

Итак, я пробую это, которое выводит ту же структуру, что и раньше:

mydb <- dbConnect(RSQLite::SQLite(), "myData.sql")
str(mydb)
Formal class 'SQLiteConnection' [package "RSQLite"] with 5 slots
  ..@ Id                 :<externalptr> 
  ..@ dbname             : chr "myData.sql"
  ..@ loadable.extensions: logi TRUE
  ..@ flags              : int 6
  ..@ vfs                : chr ""

Теперь я хотел бы посмотреть, что хранится в myData.sql, надеясь увидеть таблицу данных со столбцами (например, для mtcars). Однако при попытке я получаю ошибки:

dbGetQuery(mydb, 'SELECT * LIMIT 5')
Error in sqliteSendQuery(con, statement, bind.data) : 
  error in statement: no tables specified

а также

dbGetQuery(mydb, 'SELECT * FROM mydb LIMIT 5')
Error in sqliteSendQuery(con, statement, bind.data) : 
  error in statement: no such table: mydb

Я очень не уверен, как начать изучать информацию в myData.sql. Любые советы высоко ценится!


person Community    schedule 12.03.2015    source источник


Ответы (1)


Перво-наперво, mydata.sql не база данных SQLite, это текстовый файл, содержащий операторы SQL, которые будут создавать и заполнять вашу базу данных.

Я предлагаю вам загрузить браузер данных SQLite, такой как этот, который является мультиплатформенным. Используя этот инструмент, вы можете создать настоящую базу данных SQLite. Например, если вы используете sqlitebrowser, перейдите в Файл> Импорт> База данных из файла SQL. Это создаст базу данных, к которой вы сможете подключиться из R.

Если вам не нравится предложенный мной браузер данных, вы можете попробовать множество других, все они делают более или менее одно и то же. Удачи!

Изменить

Чтобы делать все из R, вот предложение с использованием RSQLite:

library(RSQLite)
con <- dbConnect(SQLite(), "my_db.sqlite")

Если в файле sql есть все необходимое для создания таблиц, вы можете использовать функцию dbSendQuery RSQLite:

fileName <- 'mydata.sql'
sql.query <- readChar(fileName, file.info(fileName)$size)
dbSendQuery(con, sql.query)
dbListTables(con) # to see a list of all created tables

Если вы столкнетесь с проблемами на этапе dbSendQuery, это тот случай, когда инструменты браузера данных окажутся особенно полезными, поскольку сообщения об ошибках, которые вы получите от интерпретатора R, могут не дать вам всех необходимых деталей, чтобы понять, что происходит не так.

person Dominic Comtois    schedule 12.03.2015
comment
Спасибо за объяснение моей дезинформации. Мне интересно, почему вы предлагаете использовать браузер данных SQLite (и другие браузеры данных) поверх пакета RSQLite. Это потому, что мой файл .sql не может быть заполнен пакетом RSQLite? Спасибо. - person ; 12.03.2015
comment
Вы можете делать все из R. Но я считаю, что такую ​​фоновую работу удобнее выполнять в отстойном инструменте. Я могу обновить свой ответ, чтобы показать, как это сделать, из R. - person Dominic Comtois; 12.03.2015
comment
Буду признателен, если у вас получится! Если не так уж сложно из R; Интересно, как это будет работать. Кроме того, я выполнил ваши инструкции, но получил сообщение об ошибке Ошибка при импорте данных: Ошибка в операторе № 1: синтаксическая ошибка рядом с SET. Прерывание выполнения. Я не мог найти много информации об этом в Google для устранения неполадок. Спасибо еще раз... - person ; 12.03.2015
comment
Могут возникнуть проблемы с совместимостью. SQL не является полностью стандартным для различных СУБД. К сожалению, вам может потребоваться адаптировать синтаксис sql, чтобы иметь возможность запускать его с SQLite. Если вы столкнулись с этой проблемой из инструмента браузера данных, вы также будете заблокированы R-способом. - person Dominic Comtois; 12.03.2015
comment
Только что видел, что для многострочных строк RSQLite, похоже, борется - не уверен, но это может быть, когда присутствуют разрывы строк, отличные от unix. См. Этот пост для получения дополнительной информации: stackoverflow.com/questions/18914283/ - person Dominic Comtois; 12.03.2015
comment
О, я вижу. Спасибо за ссылку. Мне немного непонятно, что делает функция dbSendQueries (), которую пользователь написал в StackOverflow. Я вижу, что он вызывает dbGetQuery (inside-r.org/packages/cran / DBI / docs / dbSendQuery). Означает ли это, что если бы я использовал сценарий, с которым вы связались в StackOverflow, мне также нужно было бы использовать функцию fetch для получения нужных мне записей? Я также заметил, что скрипт ничего не сохраняет как переменную. Итак, мне нужно было бы повторять это каждый раз, когда я хотел бы извлечь записи? Сейчас идет ~ 40 мин. Интересно, это нормально? Размер .sql составляет 41 МБ. - person ; 12.03.2015
comment
Давайте продолжим это обсуждение в чате. - person Dominic Comtois; 12.03.2015
comment
Спасибо за вашу помощь. Думаю, я изначально пропустил ваше любезное предложение пообщаться. Прошло много времени, но я так и не понял этого, и берусь за дело снова. Буду признателен за любую дополнительную помощь, если это вообще возможно! ... - person ; 21.05.2015