Ruby + ActiveRecord: невозможно записать в базу данных - PullRequest
0 голосов
/ 01 марта 2011

Я пишу скрипт на Ruby для работы.Наша компания использует FileMaker Pro для своей базы данных, и, насколько я могу судить, самый безболезненный способ получения информации из базы данных FileMaker в базу данных sqlite3 - это экспорт из FileMaker в текстовый файл с разделителями табуляцией, а затем анализ файла сRuby.

Код сортирует текстовый файл с разделителями табуляции и помещает каждый отдельный список в базе данных в какую-либо позицию в массиве.Затем он проходит через каждую позицию массива и разбивает его дальше на другой массив, так что во всех массивах позиция 1 - это номер детали, 2 - это местоположение и так далее, и так далее.Эта часть кода работает просто замечательно.

Подходит для меня та часть, которая использует ActiveRecord для записи подмассива в таблицу sqlite3.Вот неправильный код:

Partsdb.create(
                    :item_number => record_array[1], 
                    :location => record_array[2],
                    :quantity => record_array[3],
                    :make => record_array[4],
                    :year => record_array[5],
                    :model => record_array[6],
                    :serial => record_array[7],
                    :volt => record_array[8],
                    :phase => record_array[9],
                    :weight => record_array[10],
                    :list_price => record_array[11],
                    :sold => record_array[12],
                    :image_path => record_array[13],
                    :short_desc => record_array[14],
                    :long_desc => record_array[15],
                    :junk => record_array[16]
                )

Мне потребовались 'rubygems' и 'active_record', так что это не так.Вот объявление таблицы, которое я сделал в терминале sqlite3:

CREATE TABLE parts_info(item_number INTEGER PRIMARY KEY ASC, location TEXT, quantity INTEGER, make TEXT, year INTEGER, model TEXT, serial TEXT, volt INTEGER, phase INTEGER, weight INTEGER, list_price REAL, sold INTEGER, image_path TEXT, short_desc TEXT, long_desc TEXT, junk TEXT);

... и, наконец, вот сообщение об ошибке, которое я получаю в своем терминале при попытке запустить скрипт:

john@ubuntu:~/Desktop/idealm_db_parser$ ruby test.rb
/usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/connection_adapters/sqlite_adapter.rb:295:in `table_structure': Could not find table 'partsdbs' (ActiveRecord::StatementInvalid)
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/connection_adapters/sqlite_adapter.rb:186:in `columns'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/base.rb:679:in `columns'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/persistence.rb:284:in `attributes_from_column_definition'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/locking/optimistic.rb:62:in `attributes_from_column_definition'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/base.rb:1394:in `initialize'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/base.rb:496:in `new'
    from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.4/lib/active_record/base.rb:496:in `create'
    from test.rb:36:in `block (2 levels) in <main>'
    from test.rb:30:in `each'
    from test.rb:30:in `block in <main>'
    from test.rb:25:in `glob'
    from test.rb:25:in `<main>'

TRWTF - четвертая строка в выводе ошибки - «Не удалось найти таблицу« partsdbs »(ActiveRecord :: StatementInvalid).Я пытался вызывать таблицу несколькими разными способами, но она добавляет в конец имени таблицы «s» каждый раз при выводе ошибки.

Любая и вся помощь будет принята с благодарностью.Я относительно новичок в программировании, я использую Ruby только около двух недель, и я возился с ActiveRecord около 3-х дней, так что я все еще немного мокрый за ушами.

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Прежде всего, я бы порекомендовал использовать FasterCSV для анализа этого, а не использовать ваш массив. Это просто для того, чтобы вам не приходилось запоминать, какое число соответствует каждому полю.

Во-вторых, ваша модель должна иметь сингулярное + "классное" имя таблицы. Это делается для того, чтобы при вызове create для модели Active Record отобразил это в правильную таблицу. Например, если у вас есть модель Post, то вполне разумно ожидать, что у вас также есть таблица posts для ее использования.

В этом случае это невозможно из-за названия вашей таблицы. Чтобы ввести имя таблицы, используйте set_table_name в вашей модели, например:

class Part < ActiveRecord::Base
  set_table_name :parts_info
end

Я также позволил себе сменить имя класса на что-то более рубиновое. Вам не нужно говорить, что это «db», это должно быть неявным.

0 голосов
/ 01 марта 2011

sqlite несомненно может импортировать данные из файлов, разделенных табуляцией или запятыми, с помощью .import FILE TABLE;для установки разделителя используйте .separator STRING.(Это sqlite команды оболочки.)

...