使用数据映射器(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上运行了它。作品没有魔术点很好。谢谢全面的回复!删除圆点后代码运行正常,谢谢。其他建议听起来很有用。我会试试看。对于一个不太好的问题,这是一个很好的答案:)