Rails 4、RSpec、MySQL2默认值错误仅在第一个工厂出现

Rails 4、RSpec、MySQL2默认值错误仅在第一个工厂出现,rspec,ruby-on-rails-4,factory-bot,mysql2,Rspec,Ruby On Rails 4,Factory Bot,Mysql2,我正在从Rails 3.2.14升级到Rails 4。在Rails 3分支的测试套件上运行RSpec时,所有测试都通过。然而,在Rails 4分支中,我在创建工厂的第一个实例中遇到了一个错误。错误内容如下: ActiveRecord::StatementInvalid: Mysql2::Error: Field 'id' doesn't have a default value: INSERT INTO `of_of_measurements` (`aerobic_steps`, `cal

我正在从Rails 3.2.14升级到Rails 4。在Rails 3分支的测试套件上运行RSpec时,所有测试都通过。然而,在Rails 4分支中,我在创建工厂的第一个实例中遇到了一个错误。错误内容如下:

ActiveRecord::StatementInvalid:
   Mysql2::Error: Field 'id' doesn't have a default value: INSERT INTO `of_of_measurements` (`aerobic_steps`, `calories`, `date`, `device_serial`, `distance`, `is_device_input`, `server_time`, `total_steps`, `user_id`) VALUES (15, 20, '2013-09-11 16:57:36', 'HJ1', 25.0, 0, '2013-09-11 16:57:36', 10, 1)
我的工厂是这样的:

factory :upload do
  sequence(:id) { |n| n }
  date Time.zone.now
  total_steps 100
  aerobic_steps 75
  distance 500.0
  calories 50
  sequence(:device_serial) { |n| "HJ#{n}" }
  is_device_input 0
  server_time Time.now
  person
end
我知道向工厂显式添加
id
通常不太好,但考虑到我正在处理的一些遗留数据库问题需要一些奇怪的关联,我发现在这里不可避免

完整的测试套件包括几个需要创建上传工厂的测试,真正让我困惑的是,所有其他涉及上传工厂的测试都成功通过了。我很确定问题不在于任何特定的测试,因为RSpec会随机化测试运行的顺序,因此一次尝试失败的测试将在下一次通过(当它稍后在测试套件中出现时)

我在其他几个工厂也做同样的
sequence(:id){| n | n}
code,但它们都没有这个问题。我还检查了
description[table_name]和所有表的id字段看起来相同:默认为NULL,自动递增

更新 以下是模式转储中的\u of_度量值表配置:

-- Table structure for table `of_of_measurements`
--

DROP TABLE IF EXISTS `of_of_measurements`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `of_of_measurements` (
  `id` bigint(20) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `date` datetime NOT NULL,
  `total_steps` int(11) NOT NULL,
  `aerobic_steps` int(11) NOT NULL DEFAULT '0',
  `aerobic_walking_time` int(11) DEFAULT NULL,
  `calories` int(11) DEFAULT NULL,
  `distance` float DEFAULT NULL,
  `fat_burned` float DEFAULT NULL,
  `hourly_steps` text COLLATE utf8_unicode_ci,
  `hourly_aerobic_steps` text COLLATE utf8_unicode_ci,
  `hourly_equip` text COLLATE utf8_unicode_ci,
  `hourly_event` text COLLATE utf8_unicode_ci,
  `is_device_input` tinyint(4) NOT NULL,
  `day_serial` int(11) DEFAULT NULL,
  `server_time` datetime NOT NULL,
  `device_serial` text COLLATE utf8_unicode_ci,
  `weight` float DEFAULT NULL,
  `clientversion` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `platform` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `hrm_duration` int(11) DEFAULT NULL,
  `hrm_max_hr` int(11) DEFAULT NULL,
  `hrm_avg_hr` int(11) DEFAULT NULL,
  `hrm_status` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL,
  `hrm_distance_readings` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL,
  `hrm_hr_readings` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL,
  `walkMass` float DEFAULT NULL,
  `aerobicMass` float DEFAULT NULL,
  `aerobicCalories` int(11) DEFAULT NULL,
  `basalMetabolism` int(11) DEFAULT NULL,
  `walkCalories` int(11) DEFAULT NULL,
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `unique_measure` (`date`,`device_serial`(20),`user_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

我找到了这个问题的答案。旧数据库未将
id
字段设置为自动递增。因此,database_cleaner在清理测试套件数据库时遇到问题。解决方案是将self.primary_key='id'
添加到我的上传模型中。

我找到了这个问题的答案。旧数据库未将
id
字段设置为自动递增。因此,database_cleaner在清理测试套件数据库时遇到问题。解决方案是将
self.primary\u key='id'
添加到我的上传模型。

我发现SQL语句中缺少id字段。其他测试也是这样吗?Mike,你能从你的模式中共享你的of_of_度量值表信息吗?Rudy-我在update.Kori中添加了of_of_度量值模式。id字段似乎只在第一次测试中的SQL语句中丢失。我不太确定如何查看其他测试的SQL语句,因为它们通过了测试。(我只在错误消息中看到SQL)我看到SQL语句中缺少id字段。其他测试也是这样吗?Mike,你能从你的模式中共享你的of_of_度量值表信息吗?Rudy-我在update.Kori中添加了of_of_度量值模式。id字段似乎只在第一次测试中的SQL语句中丢失。我不太确定如何查看其他测试的SQL语句,因为它们通过了测试。(我只在错误消息中看到SQL)