使用data_mapper运行时如何解决DataObjects :: ConnectionError(Ruby 1.8.7)

时间:2013-02-07 08:14:05

标签: ruby linux ruby-datamapper sqlite3-ruby

当我运行此代码时

require 'rubygems'
require 'data_mapper'
require "sqlite3"

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}./prod.db")

class Person
  include DataMapper::Resource
  property :id, Serial

  def initialize(name)
    self[:name] = name
    self.save!
  end

end

DataMapper.finalize.auto_migrate!

抛出此错误

  

DataObjects :: ConnectionError:无法打开数据库文件(代码:14,   sql state :, query :, uri :)。

似乎在抱怨DataMapper.finalize.auto_migrate!行。

如果我注释掉这个人类,那么代码运行正常,虽然有些无用。

我收到错误的操作系统是Linux Mageia 2.我在WindowsXP和Windows7上都运行了这个运行Ruby 1.9.3,但我怀疑问题是旧的ruby版本不是操作系统的问题。

另外,对我来说,告诉你包含该文件的文件夹的权限是非常开放的(-rwxrwxrwx)可能很重要(它可能不适合日常使用它,但我很想得到它data_mapper working)。

以下是其他可能有趣的规格 我当地的宝石 sqlite3(1.3.7,1.3.3) sqlite3-ruby(1.3.3) data_mapper(1.2.0)

我知道这里有很多变量可以改变。我以为我会先把它放在那里然后看看是不是简单的解决了我是一个令人沮丧的失踪:)

1 个答案:

答案 0 :(得分:1)

在您的代码中,您有DataMapper设置说明

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}./prod.db")

,它告诉sqlite数据库文件位置位于名为:当前工作目录+ .的目录中,找不到该错误,因此无法找到错误。因此,从URI中删除点应解决该部分的问题。

请注意#{Dir.pwd}指向当前工作目录;相对于当前文件,指向绝对路径可能更安全,而是说 - 例如:File.dirname(File.expand_path(__FILE__))。原因是如果文件在它所在的目录之外使用,则可以找到它。

现在为类定义。在初始化中,您引用了一个名为name的不存在的方法/属性。我认为你所寻找的只是一个财产声明,例如

property :name, String

您不需要初始化程序,例如,您可以使用Person.create(:name => 'Foo')将对象持久保存到数据库中。

说到这一点,回到默认数据库连接,您可能会对使用内存中的sqlite进行测试感兴趣。你可以通过

来做到这一点
DataMapper.setup(:default, "sqlite::memory:')

每次使用该文件时,这将从一个干净的平板启动数据库。