我编写了一个应用程序,我计划通过 DataMapper 和 sqlite3 保存用户数据,并使用 GDBM 保存项目(其中几个)。当我使用 irb 运行它时,User.new 和 inventory 方法工作正常,但是 DataMapper 说我的用户模型无效并且不保存它。我之前使用过 DataMapper 并且从未遇到过这样的错误,事实上我使用了相同的用户模型(使用密码盐和哈希),在sinatra-datamapper 应用程序中没有任何错误。
为了清楚起见,我打算将用户名和“gdbm 数据库文件的路径”都保存为 datamapper 中的字符串。gdbm 创建自己的 db 文件,所有方法都可以正常工作,没有抱怨,所有数据都是持久的。由于我不是要保存 gdbm 对象,而只是在 datamapper 中保存一个字符串,所以我认为验证应该没有问题。
DataMapper::Model.raise_on_save_failure = true
没有给出错误的具体描述,但save!
方法给出了以下错误:
DataObjects::IntegrityError: users.name may not be NULL (code: 19, sql state: , query: INSERT INTO "users" DEFAULT VALUES, uri: sqlite3:/home/barerd/game_inventory/users.db?scheme=sqlite3&user=......
但是当我在 irb 中检查时,名称属性不为空。
也许错误源于sqlite,但我不知道测试它。有人可以指导我如何检查此错误吗?
require 'gdbm'
require 'data_mapper'
require 'dm-validations'
DataMapper.setup :default, 'sqlite://' + Dir.pwd + '/users.db'
class User
attr_reader :name, :inventory_db
include DataMapper::Resource
property id, Serial
property :name, String, :required => true, :unique => true, :messages => { :presence =>...... etc }
property :inventory_db, String
def initialize name
@name = name
@inventory_db = Dir.pwd + '/#{name}_inventory.db'
end
def inventory
GDBM.new @inventory_db, 0644, GDBM::WRCREAT
end
..several methods related to inventory..
end
DataMapper.finalize.auto_migrate!