【发布时间】:2009-01-12 19:05:43
【问题描述】:
我正在尝试运行 rake test:units,但我不断收到此消息:
Mysql::Error: Duplicate entry '2147483647' for key 1: INSERT INTO `ts_schema_migrations` (version) VALUES ('20081008010000')
“ts_”在那里是因为我设置了ActiveRecord::Base.table_name_prefix。我很困惑,因为表中已经没有值“20081008010000”,并且没有值“2147483647”的迁移(尽管该值确实出现在表中)。
在 Rails 的schema_statments.rb 中,有以下内容:
def initialize_schema_migrations_table
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
unless tables.detect { |t| t == sm_table }
create_table(sm_table, :id => false) do |schema_migrations_table|
schema_migrations_table.column :version, :string, :null => false
end
...
在我的开发数据库中,ts_schema_migrations.version 是一个VARCHAR。在测试中,虽然它是INTEGER。我已经删除了这些表并多次重新运行迁移(和/或rake db:schema:load RAILS_ENV=test)。没有变化。
我的 MySQL 适配器有问题吗?
【问题讨论】:
-
2147483647 是最大的 32 位有符号整数。但是为什么会有溢出呢?
-
因为 Rails 试图将用于 VARCHAR 的 '20081008010000' 插入一个整数,但它不适合。 MySQL 试图提供一些帮助。嗯,这是我的猜测。
-
但我的问题是为什么数据库希望该表成为 INTEGER 列?我删除并重新添加了 schema_migrations 表,但 Rails 坚持将其创建为 INTEGER。
标签: mysql ruby-on-rails ruby testing migration