gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:01 25 4
gpt4 key购买 nike

当我运行这段代码时

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com