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クラスをコメントアウトすると、コードは、多少役に立たないものの、正常に実行されます。

エラーが発生しているOSはLinuxMageia2です。Ruby1.9.3を実行しているWindowsXPとWindows7でこれを正常に実行しましたが、問題は古いルビーバージョンがOSではなく古いバージョンであると思われます。

また、ファイルを含むフォルダーのアクセス許可が非常に開いている(-rwxrwxrwx)ことを伝えることはおそらく重要です(日常的に使用するためにこれを開くことはおそらく実用的ではありませんが、data_mapperを機能させるために必死です) 。

興味深いかもしれない他の仕様は次のとおりです私のローカルgemssqlite3(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 に答える