【问题标题】:How do I create an UNSIGNED INT for MySQL in a Rails 5 migration?如何在 Rails 5 迁移中为 MySQL 创建 UNSIGNED INT?
【发布时间】:2017-11-27 02:14:31
【问题描述】:

使用activerecord (< 5.0, >= 3.2),我可以使用activerecord-mysql-unsigned gem 在我的MySQL 数据库中创建一个UNSIGNED INT,但是该gem 没有更新,我在Rails 中找不到任何关于本机支持的文档5.

是否有选项哈希或可以在 add_column 方法中调用的东西来允许这样做?

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    从 Rails 5.1.x 开始,可以选择无符号整数、大整数、小数和浮点 in the schema adapter for MySQL

    在您的迁移中这样的事情将在 Rails 5.1.4 中工作

      def up
        create_table :unsigned_columns do |t|
    
          t.integer "positive", :unsigned => true
    
          t.timestamps
        end
      end
    

    【讨论】:

    • 有没有办法默认做到这一点。即,就像在 Rails 3 和 4 中覆盖 NATIVE_DATABASE_TYPES。所以默认情况下,新表是使用 BigInt Unsigned id 列创建的?
    • @JoshuaPinter 这是我不建议覆盖默认值而是在迁移中明确说明这些修改的地方之一。您可以修改生成器以自动执行默认更改。因此不必每次都手动编写迁移。 edgeguides.rubyonrails.org/…
    • 我真的认为unsigned 应该是在 Rails 中使用 MySQL 时的默认主键。我创建了一个 GitHub 问题来表明这种偏好,Rafael 似乎同意了,所以我将编写一个 PR 以使主键为 unsigned bigint 作为 Rails 6.2 中的默认值。随时表示您对这个问题的支持:github.com/rails/rails/issues/40967
    • 我同意 unsigned 应该是默认值。看起来从那个 GH 问题你已经有一个功能请求来改变它。我在这里唯一要补充的是性能回归测试已经完成。对于大多数中小型项目来说,大约 40 亿个 id 对象就足够了。从 4 字节存储迁移到 8 字节存储可能会线性甚至指数地增加列遍历和检索时间。
    • 绝对同意这一点。但是默认的列类型已经是bigint。这在 Rails 5.1 (github.com/rails/rails/pull/26266) 中有所改变。我要做的唯一改变是使用unsigned 而不是signed。那应该不会有任何性能变化吧?
    【解决方案2】:

    如果使用 rails > 5.1 并且您希望使用 unsigned integer 作为默认类型生成所有主键,您所要做的就是在您的 config/application.rb 中调整您的生成器,添加以下代码:

    config.generators do |g|
          # ... other configurations
          g.orm :active_record, primary_key_type: :unsigned_integer
    end
    

    调用rails generate model foo bar:string 将创建id 为未签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-09
      • 2017-04-29
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多