【问题标题】:Rails unit tests fail because of unique constraint on schema_migrations由于 schema_migrations 的唯一约束,Rails 单元测试失败
【发布时间】: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


【解决方案1】:

看起来你的测试模式好像是 Rails 1.x,而开发是 Rails 2。也许你可以设置 RAILS_ENV 来测试和运行rake db:reset

【讨论】:

    【解决方案2】:

    从 Rails 1.x 升级到 2.0 时,您似乎跳过了一些步骤。

    浏览并阅读升级说明:

    http://www.slashdotdash.net/2007/12/03/rails-2-upgrade-notes/

    以及发行说明:

    http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done

    他们会告诉您需要遵循的所有步骤。特别是重新生成所有脚本并将数据库迁移到新的数据库迁移系统,通过时间戳而不是递增迁移 id。

    【讨论】:

    • 我从来没有在这台计算机、这个数据库或这个项目中使用过 Rails 1.x。我很困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2019-04-28
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多