如何使Rails生成'schema.rb'与MySQL的bigint支持?

p.m*_*los 6 mysql ruby-on-rails schema.rb bigint

我正在使用Rails 3.0.5.我使用MySQL作为数据库存储.我有一个模型,其中一列需要是BIGINT.我在创建迁移文件中使用以下内容:

t.column  :my_column_name,       :bigint
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

但是,当我跑

rake db:migrate

生成的'schema.rb'文件为特定列创建以下行:

t.integer  "my_column_name",       :limit => 8
Run Code Online (Sandbox Code Playgroud)

这是不正确的.

我的问题是我错在哪里?为了获得正确的'schema.rb'文件,我应该做些什么吗?我可以更改'schema.rb'文件的生成方式吗?

请注意,'schema.rb'文件错误这一事实会导致我的持续集成服务器出现问题,该服务器运行测试并使用'schema.rb'文件从头开始创建数据库(在运行测试之前).

p.m*_*los 9

我现在意识到了

t.integer "my_column_name", :limit => 8
Run Code Online (Sandbox Code Playgroud)

with my_sql驱动程序在schema.rb文件中是CORRECT.

使用'schema.rb'文件生成的数据库会创建一个

bigint(20)
Run Code Online (Sandbox Code Playgroud)

虽然这看起来很奇怪.

我通过调查my_sql适配器的代码找到了这个,我在这里引用它的片段:

 def type_to_sql(type, limit = nil, precision = nil, scale = nil)
       return super unless type.to_s == 'integer'
        case limit
        when 1; 'tinyint'
        when 2; 'smallint'
        when 3; 'mediumint'
        when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
        when 5..8; 'bigint'
        else raise(ActiveRecordError, "No integer type has byte size #{limit}")
        end
      end
Run Code Online (Sandbox Code Playgroud)

很明显,那里:limit => 8最终会在mysql db中创建一个bigint.

  • 无论如何,这对我不起作用。我发现将 bigint 列的默认值设置为 18446744073709551615(20 位)时,db:test:prepare 会抱怨 Invalid default value,打印 CREATE TABLE 语句。在这里,我看到只使用了 'bigint' 而没有 (20)。在 application.rb 中设置 config.active_record.schema_format = :sql 创建正确的数据库结构。 (2认同)