Ruby 当从rb提供属性时,null验证失败

Ruby 当从rb提供属性时,null验证失败,ruby,rom-rb,Ruby,Rom Rb,我试图使用sqlite3掌握rom rb持久性库 我运行了以下迁移,其中包括notnull约束: ROM::SQL.migration do change do create_table :users do primary_key :id column :name, String, null: false column :age, Integer column :is_admin, TrueClass end end end

我试图使用sqlite3掌握rom rb持久性库

我运行了以下迁移,其中包括
notnull
约束:

ROM::SQL.migration do
  change do
    create_table :users do
      primary_key :id
      column :name, String, null: false
      column :age, Integer
      column :is_admin, TrueClass
    end
  end
end
这是我的简单的
app.rb

require 'rom'

rom = ROM.container(:sql, 'sqlite://db/my-db-file.db') do |config|
  class Users < ROM::Relation[:sql]
    schema(infer: true)
  end

  config.relation(:users)
end

users = rom.relations[:users]
puts users.to_a.inspect # => []

create_user = users.command(:create)
create_user.call( name: 'Rob', age: 30, is_admin: true )
puts users.to_a.inspect # never reached
需要“rom”
rom=rom.container(:sql,'sqlite://db/my-db-file.db“)do | config|
类用户[]
create_user=users.command(:create)
创建用户呼叫(姓名:“Rob”,年龄:30,是管理员:true)
将用户放置到a.inspect#从未到达
尝试运行此脚本时产生以下输出:

Roberts-MacBook-Pro:my-rom-demo Rob$ ruby app.rb 
[]
/Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `step': SQLite3::ConstraintException: NOT NULL constraint failed: users.name (ROM::SQL::NotNullConstraintError)
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `block in each'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `loop'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `each'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in `to_a'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in `block in execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:95:in `prepare'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:189:in `block (2 levels) in _execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/logging.rb:38:in `log_connection_yield'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:189:in `block in _execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/connecting.rb:253:in `block in synchronize'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/connection_pool/threaded.rb:91:in `hold'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/connecting.rb:253:in `synchronize'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:180:in `_execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:146:in `execute_insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/dataset/actions.rb:1099:in `execute_insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/sequel-5.11.0/lib/sequel/dataset/actions.rb:399:in `insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/relation/writing.rb:39:in `insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in `block in insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in `map'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in `insert'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:31:in `execute'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-core-4.2.1/lib/rom/command.rb:280:in `call'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/error_wrapper.rb:16:in `call'
    from /Rob.rvm/gems/ruby-2.4.0@learn-rails/gems/rom-core-4.2.1/lib/rom/commands/composite.rb:17:in `call'
    from app.rb:15:in `<main>'
Roberts MacBook Pro:my rom demo Rob$ruby app.rb
[]
/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in'step':sqlite3::ConstraintException:notnull约束失败:users.name(ROM::SQL::NotNullConstraintError)
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in'block in each'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in'loop'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in'each'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in'to_a'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in'block in execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:95:in'prepare'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in'execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:189:in'block(2层)in_execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/logging.rb:38:in'log\u connection\u yield'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:189:in'block in_execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/connecting.rb:253:in'block in synchronize'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/connection_pool/threaded.rb:91:in'hold'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/database/connecting.rb:253:in'synchronize'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:180:in`\u execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/adapters/sqlite.rb:146:in'execute_insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/dataset/actions.rb:1099:in'execute_insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/sequel-5.11.0/lib/sequel/dataset/actions.rb:399:in'insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/relation/writing.rb:39:in'insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in'block in insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in'map'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:46:in'insert'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/create.rb:31:in'execute'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-core-4.2.1/lib/rom/command.rb:280:in'call'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-sql-2.5.0/lib/rom/sql/commands/error_wrapper.rb:16:in'call'
from/Rob.rvm/gems/ruby-2.4。0@learn-rails/gems/rom-core-4.2.1/lib/rom/commands/composite.rb:17:in'call'
来自app.rb:15:in`'
当我提供属性时,为什么它认为我的
名称
属性是空的?

注意:在一些测试和了解ops gem版本后,我修改了我的答案

出现
NULL约束
错误的原因是ROM没有 为用户表加载架构

当您在下面定义容器时

rom = ROM.container(:sql, 'sqlite://db/my-db-file.db') do |config|
  class Users < ROM::Relation[:sql]
    schema(infer: true)
  end

  config.relation(:users)
end
如果您想使用独立的关系类而不是容器配置dsl,那么我建议您仔细阅读

数据库创建问题

有很多事情可能会阻止创建sqlite数据库

  • 这可能是权限问题
  • 目录结构可能不存在
  • Sqlite可能不会被编译来处理URI(仅当您在路径中使用
    文件://
    时才起作用)

我的建议是,在使用sqlite和ROM时,使用上面脚本中的opts哈希示例,并尝试使用当前工作目录中的相对路径。这似乎总是有效的。

您尝试过变更集吗<代码>用户。变更集(:create,name:'Bob')。提交
感谢回复。不-我对ROM完全不熟悉,但据我从文档中了解到的,变更集是建立在命令之上的抽象,我有意做最简单的事情。我会试试看它是否有效。试过了,得到了相同的错误。是的,这很好,谢谢。但我试图让它与sqlite一起工作。FYI ROM版本4.2.1 ROM版本2.5.0续集版本5.11.0 SQLite3 Gem版本1.3.13奇怪的是,如果我用
ROM.container(:sql,'sqlite://my db file.db')
(注意:没有db/path)替换配置,那么我会得到所需的输出,但它似乎没有创建db文件。另外,我确实使用sqlite cli检查了迁移创建的模式,看起来还不错。顺便说一句,尝试将持久数据库的创建与访问该数据库的脚本分开,这就是为什么我选择迁移而不是此版本(这是目前最常见的迁移)
require 'rom'
require 'rom/sql'
require 'sqlite3'

puts "ROM Version #{ROM::Core::VERSION}" # 4.2.1
puts "ROM Version #{ROM::SQL::VERSION}" # 2.5.0
puts "Sequel Version #{Sequel::VERSION}" # 5.11.0
puts "SQLite3 Gem Version #{SQLite3::VERSION}" # 1.3.13

opts = {
  adapter: :sqlite,
  database: 'c:/mydb.db'
}

rom = ROM.container(:sql, opts) do |c|
  # Just another way to write the same users table
  # c.gateways[:default].create_table(:users) do
  #   column :id,   :integer, primary_key: true
  #   column :name, :string, null: false
  #   column :age,  :integer
  #   column :is_admin, :bool
  # end

  c.gateways[:default].create_table :users do
    primary_key :id
    column :name, String, null: false
    column :age, Integer
    column :is_admin, TrueClass
  end

  c.relation(:users) do
    schema(infer: true)
  end
end

users = rom.relations[:users]
puts users.to_a.inspect # => []

create_user = users.command(:create)
create_user.call(name: 'Rob', age: 30, is_admin: true)
puts users.to_a.inspect # never reached

# Uncomment if you want to see the users schema
# puts users.dataset.db.schema(:users)