加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Datamapper在通过thin(sinatra)访问时擦除sqlite db

发布时间:2020-12-17 02:03:48 所属栏目:百科 来源:网络整理
导读:我正在使用sinatra datamapper构建一个小型Web应用程序.该应用程序基于一个sqlite数据库,该数据库包含table1中的大量记录,而table2中没有任何记录. 我的目录结构如下: total 32-rw-r--r-- 1 atma staff 1895 31 Δεκ 21:35 application.rbdrwxr-xr-x 6 at
我正在使用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

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

我的db_scheme.rb是gist.

知道为什么datamapper表现得那样吗?

PS.我通过从database.rb手动运行一个创建数据库的方法将数据加载到数据库.

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

解决方法

在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

如果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...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读