【问题标题】:Ruby + ActiveRecord: Can't write to databaseRuby + ActiveRecord:无法写入数据库
【发布时间】:2011-02-28 22:02:52
【问题描述】:

我正在用 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 行 - 'Could not find table 'partsdbs' (ActiveRecord::StatementInvalid)。我尝试过多次调用该表,但每次在错误输出中它都会在表名的末尾附加一个“s”。

我们将不胜感激任何和所有的帮助。我对编程比较陌生,我只使用了 Ruby 大约两个星期,而且我已经在 ActiveRecord 上搞砸了大约 3 天,所以我还是有点耳后。

感谢阅读。

【问题讨论】:

    标签: ruby activerecord filemaker


    【解决方案1】:

    首先,我建议使用 FasterCSV 来解析它,而不是使用您的数组。这样您就不必记住每个字段对应的数字。

    其次,您的模型必须具有表的单数化 +“classy”名称。这样当您在模型上调用create 时,Active Record 会将其映射到正确的表。例如,如果您有一个 Post 模型,则可以合理地预期您也有一个 posts 表与之配套。

    在这种情况下,这是不可能的,因为您的表是如何命名的。要强制使用表名,请在模型中使用 set_table_name,如下所示:

    class Part < ActiveRecord::Base
      set_table_name :parts_info
    end
    

    我还冒昧地将类名更改为更符合 Ruby 风格的名称。你不需要说它是一个“db”,应该是隐含的。

    【讨论】:

    • 你是个学者,也是个绅士。更改大约三行使一切正常。我将暂时保留这些数组,因为我已经在这个项目上花费了太多时间(并且即将完成),但我会尽可能用 FasterCSV 重写它。
    【解决方案2】:

    sqlite当然可以使用.import FILE TABLE从制表符或逗号分隔的文件中导入数据;设置分隔符使用.separator STRING。 (这些是sqlite shell 命令。)

    【讨论】:

    • 我必须研究一下,因为我确信它将来会派上用场。感谢您的意见。
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2020-08-03
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多