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

标签 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: 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/

相关文章:

ruby-on-rails - 那是带有覆盖参数的 ruby​​ on rails 奇怪行为吗?或者我只是再次不了解 ruby ?

ruby - 在 Ubuntu 12.04 上安装 compass 和 Susy

SQLITE3 : Creating database from command line takes forever

linux - rc.local 可以在启动前等待 Bash 脚本完成吗

linux - Bash 输入重定向为命令提供标准输入而不是参数/文件名?

ruby-on-rails - 将原始 SQL 查询的结果转换为 JSON(和 CSV)

ruby - 如何在 DataMapper 中将定稿分离到不同的数据库中?

ruby-on-rails - irb/rails 控制台中的颜色

ruby - 缓慢的 Ruby DataMapper.setup

ruby - ssl`sysread_nonblock' : end of file reached (EOFError)