当我运行这段代码时
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: unable to open database file (code: 14, sql state: , query: , uri: ).
它似乎在提示 DataMapper.finalize.auto_migrate!
行。
如果我注释掉 person 类,代码运行良好,尽管有些无用。
我遇到错误的操作系统是 Linux Mageia 2。我在运行 Ruby 1.9.3 的 WindowsXP 和 Windows7 上运行良好,但我怀疑问题是旧的 ruby 版本不是操作系统的问题。
此外,我可能很重要地告诉您,包含该文件的文件夹的权限是非常开放的 (-rwxrwxrwx)(对于日常使用来说,如此开放可能不切实际,但我很想得到data_mapper 工作)。
以下是其他可能有趣的规范 我本地的 gem sqlite3 (1.3.7, 1.3.3) sqlite3-ruby (1.3.3) 数据映射器(1.2.0)
我知道这里有很多变量可以更改。我想我会先把它放在那里,看看它是否是我愚蠢地遗漏的简单修复 :)
最佳答案
在您的代码中,您有 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:')
这将在您每次使用该文件时从干净的平板启动数据库。
关于ruby - 使用 data_mapper (Ruby 1.8.7) 运行时如何解决 DataObjects::ConnectionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746490/