我正在使用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
是gist。
任何想法为什么datamapper的行为都是这样的?
PS。我通过从创建数据库的database.rb
手动运行方法将数据加载到数据库。
最好的问候,并提前感谢您的时间!
答案 0 :(得分: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...