0

当我运行这段代码

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)对我来说可能很重要(它可能不适合日常使用,但我迫切希望让 data_mapper 工作) .

以下是其他可能有趣的规格 我的本地宝石 sqlite3 (1.3.7, 1.3.3) sqlite3-ruby (1.3.3) data_mapper (1.2.0)

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

4

1 回答 1

1

在您的代码中,您有 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:')

每次使用该文件时,这都会从一个干净的状态启动数据库。

于 2013-02-07T12:28:23.893 回答