Ruby on rails ActiveRecord::NotNullViolation-Mysql2列不能为null
我在通过FactoryBot创建记录时遇到了一个问题,这个问题只发生在Ruby on rails ActiveRecord::NotNullViolation-Mysql2列不能为null,ruby-on-rails,testing,rspec,factory-bot,Ruby On Rails,Testing,Rspec,Factory Bot,我在通过FactoryBot创建记录时遇到了一个问题,这个问题只发生在测试环境中 在开发控制台上运行命令时: FactoryBot.create(:accounting\u pbs\u reservation,factor:3.0)(列factor也在工厂中定义,但我想明确地传递它) 然后它被正确执行和创建,但是当我在测试环境中运行命令时,它会打印错误: ActiveRecord::NotNullViolation: Mysql2::Error: Column 'factor' cannot
测试
环境中
在开发控制台上运行命令时:
FactoryBot.create(:accounting\u pbs\u reservation,factor:3.0)
(列factor
也在工厂中定义,但我想明确地传递它)
然后它被正确执行和创建,但是当我在测试环境中运行命令时,它会打印错误:
ActiveRecord::NotNullViolation:
Mysql2::Error: Column 'factor' cannot be null:
INSERT INTO `accounting_pbs_reservations` (`start`, `rl_walltime`, `factor`)
VALUES (1503468000, 1430000, 3.0)
即使出现因子列
当我想在RSpec控制器中创建模型的实例时,也会出现这个问题
有人遇到过同样的问题吗?测试
和开发
因子
的数据库架构设置为
| Field | Type | Null | Key | Default | Extra
| factor | double | NO | | 1 |
FactoryBot定义非常简单:
FactoryBot.define do
factory :accounting_pbs_reservation do
factor { 1.0 }
start { 1_503_468_000 }
rl_walltime { 1_430_000 }
end
end
发生错误的RSpec定义:
require 'rails_helper'
RSpec.describe AccountingPbsReservationsController, type: :controller do
let(:valid_accounting_pbs_reservation) { FactoryBot.create(:accounting_pbs_reservation) }
let(:valid_attributes) { FactoryBot.attributes_for(:accounting_pbs_reservation) }
...
context 'when logged as admin' do
login_admin
it "returns a success response" do
get :show, params: { id: valid_accounting_pbs_reservation.to_param expect(response).to be_successful
end
...
所以问题出在数据库触发器上
如果相关表中没有数据,触发器将
因子
值设置为null。相关的表是空的,因为当测试完成时,它会清除整个数据库。可能会拒绝值3.0(可能只有int值??),然后保留空值。。只是猜测here@NikosM. 问题仍然存在,该列在数据库中设置为双精度。是否可以尝试使用另一个非隐式整数的值,例如3.123?是否可以运行ActiveRecord::Base.connection.execute“INSERT INTOaccounting\u pbs\u reservations
(start
,rl\u walltime
,factor
)值(1503468000,143000,3.0)“并报告发生了什么?”因此我解决了问题。问题出现在数据库触发器上,如果相关表为空,则将值设置为null。而该表为空,因为在测试环境中,我清除了整个数据库。