Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用数据映射器(Ruby 1.8.7)运行时,如何解析DataObjects::ConnectionError_Ruby_Linux_Ruby Datamapper_Sqlite3 Ruby - Fatal编程技术网

使用数据映射器(Ruby 1.8.7)运行时,如何解析DataObjects::ConnectionError

使用数据映射器(Ruby 1.8.7)运行时,如何解析DataObjects::ConnectionError,ruby,linux,ruby-datamapper,sqlite3-ruby,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 s

当我运行此代码时

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状态:,查询:,uri:)

它似乎在抱怨
DataMapper.finalize.auto_migrate

如果我注释掉person类,代码运行良好,尽管有些无用

我得到错误的操作系统是Linux Mageia 2。我在运行Ruby 1.9.3的WindowsXP和Windows7上都运行得很好,不过我怀疑问题在于较旧的Ruby版本,而不是操作系统

另外,我必须告诉您,包含该文件的文件夹的权限是非常开放的(-rwxrwxrwx)(对于日常使用来说,这样开放可能并不实际,但我非常希望让数据映射器工作)

以下是可能有趣的其他规格 我当地的珍宝 sqlite3(1.3.7,1.3.3) SQLite3Ruby(1.3.3) 数据映射器(1.2.0)


我知道这里有很多可以改变的变量。我想我会先把它放在那里,看看这是否是我愚蠢地错过的简单修复:)

在代码中,您有DataMapper设置指令

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}./prod.db")
这表明sqlite数据库文件位置位于名为:current working directory+
的目录中,该目录无法找到,因此出现错误。因此,从URI中删除点应该可以解决该部分的问题

注意,
{Dir.pwd}
指向当前工作目录;指向与当前文件相关的绝对路径可能更安全,方法是说–例如:
file.dirname(file.expand\u path(\uu file\uu))
。原因是,如果文件在其所在目录之外使用,则可以找到它

现在来看类定义。在初始化过程中,您引用了一个不存在的名为
name
的方法/属性。我想你要找的只是一份财产声明,比如

property :name, String
您不需要初始值设定项,您可以使用,例如,
Person.create(:name=>Foo')
将对象持久化到数据库中

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

DataMapper.setup(:default, "sqlite::memory:')

这将在每次使用该文件时重新启动数据库。

您是否可以尝试将
DataMapper::setup(:default,“sqlite3://{Dir.pwd}./prod.db”)
更改为
DataMapper::setup(:default,“sqlite3://{Dir.pwd}/prod.db”)
?刚刚在我的Ruby 1.8.7上运行了它。作品没有魔术点很好。谢谢全面的回复!删除圆点后代码运行正常,谢谢。其他建议听起来很有用。我会试试看。对于一个不太好的问题,这是一个很好的答案:)