4

我正在使用 sinatra + datamapper 构建一个小型 Web 应用程序。该应用程序基于一个 sqlite 数据库,该数据库在 table1 中包含大量记录,而在 table2 中没有任何记录。

我的目录结构如下:

total 32
-rw-r--r--   1 atma  staff  1895 31 Δεκ 21:35 application.rb
drwxr-xr-x   6 atma  staff   204 31 Δεκ 21:10 archive/
-rw-r--r--@  1 atma  staff    82 23 Δεκ 23:59 config.ru
drwxr-xr-x  10 atma  staff   340 31 Δεκ 21:38 lib/
drwxr-xr-x   4 atma  staff   136 27 Δεκ 20:01 public/
drwxr-xr-x   6 atma  staff   204 24 Δεκ 00:00 views/
ls -R lib
database.rb       db_scheme.rb      db_status.yaml    fileutils.rb      greek-dict.txt        greekcase.rb      rankmanager.rb    wodb_el_v0.0.1.db

该数据库位于lib/wodb_el_v0.0.1.db. 所有这些文件都包含类。

当我通过添加以下行来调用类在 rankmanager.rb 或 database.rb 中运行测试时:

Class TestClass
[code goes here]
end
x = TestClass.new
x.test_class_method

当我这样做时,一切都运行良好。当我删除执行测试的行(在其中创建对象并运行方法)并require_relative在我的 . 中时application.rb它会擦除​​数据库而不是使用它。数据库由db_scheme.rb加载的处理database.rb

db_scheme.rb要点

知道为什么 datamapper 会这样吗?

附言。我通过手动运行database.rb创建数据库的方法将数据加载到数据库。

最好的问候,并提前感谢您的时间!

4

1 回答 1

1

在你的db_scheme.rb你有:

version = '0.0.1' # database version
db = 'wodb_el_v' + version + '.db' #db location

DataMapper.setup( :default, "sqlite3:///Users/atma/Dropbox/Programming/Projects/Local/HOWDB/lib/#{db}" )

...

if File.exists?(db)
    DataMapper.auto_upgrade!
else
    DataMapper.auto_migrate! # erases and creates the database. This needs run before any work is done with the database!
end

该行if File.exists?(db)检查文件是否存在于当前工作目录中,即您启动程序的目录。当您启动 Thin 时,该目录将是父目录,而不是lib目录,因此将找不到该文件并将运行该文件,从而auto_migrate!擦除您的数据。

您应该确保始终处理数据库文件的绝对路径:

version = '0.0.1' # database version
db = File.expand_path('../wodb_el_v#{version}.db', __FILE__)

DataMapper.setup(:default, "sqlite3:///#{db}" )

if File.exists?(db) #db is now the absolute path
  # as before...
于 2012-12-31T20:55:14.093 回答