我正在用Ruby写一个脚本来工作。我们公司使用FileMaker Pro作为其数据库,据我所知,从FileMaker数据库获取信息到sqlite3数据库的最简单方法是从FileMaker导出到制表符分隔的文本文件,然后解析文件红宝石。
代码对制表符分隔的文本文件进行排序,并将每个单独的数据库列表放入数组中的某个位置。然后,它遍历每个阵列位置并将其进一步分解为另一个阵列,这样在所有阵列中,位置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是错误输出中的第4行 - “找不到表'partsdbs'(ActiveRecord :: StatementInvalid)。我已经尝试过调用表几个不同的东西,但是每次在错误输出中它都会在表名的末尾追加一个's'。
非常感谢任何和所有帮助。我对编程比较陌生,我只使用Ruby大约两个星期了,而且我已经在使用ActiveRecord大约3天了,所以我的耳朵还是有点湿了。
感谢阅读。
答案 0 :(得分:1)
首先,我建议使用FasterCSV来解析它,而不是使用你的数组。这样您就不必记住与每个字段匹配的数字。
其次,您的模型必须具有表格的单一+“优等”名称。这样,当您在模型上调用create
时,Active Record会将其映射到正确的表。例如,如果您有Post
模型,则可以合理地预期您还有一个posts
表格。
在这种情况下,由于表的命名方式,这是不可能的。要强制使用表格名称,请在模型中使用set_table_name
,如下所示:
class Part < ActiveRecord::Base
set_table_name :parts_info
end
我也冒昧地将类名更改为更多Ruby-esque。你不需要说它是“db”,这应该是隐含的。
答案 1 :(得分:0)
sqlite
当然可以使用.import FILE TABLE
从制表符或逗号分隔的文件中导入数据;设置分隔符使用.separator STRING
。 (这些是sqlite
shell命令。)