【问题标题】:Rails Migrations and non-standard data types?Rails 迁移和非标准数据类型?
【发布时间】:2012-08-22 12:55:38
【问题描述】:

最初的问题

在我的 Rails 应用程序中,我需要处理旧数据库中的数据,并使用大量数据作为主键。超出 MySQLPostgreSQL 的 4 字节 INT 或 INTEGER 数据类型限制的数字。但这正是 Rails 的适配器将“integer”翻译成的数据类型。

我的解决方法

这在开发中不是问题,因为 SQLite 只有一种接受大数的整数类型。但是对于暂存/生产(即与任何 SQLite 一起使用),我必须手动编辑schema.rb 文件以将t.integer "id" 替换为t.column "id", 'BIGINT'。然后加载架构,导入数据,它就可以工作了。

解决方法的问题

现在,每次我运行 Rails 迁移以对数据库架构进行细微更改时,都会自动重新生成整个 schema.rb 文件,并且我的所有 id 列再次只是 t.integer。和以前一样,这在开发(SQLite)中不是问题,但它可能会在生产中,不是吗?我不想每次需要添加或重命名列时都必须删除数据库、加载架构并重新导入所有数据——我更愿意为此使用迁移。

到目前为止,我的解决方法是在迁移之前制作schema.rb 的备份副本,然后将迁移所做的添加与我自己的合并。有人有更好的主意吗?

【问题讨论】:

  • 知道我不应该编辑schema.rb,但我找不到一个好的替代方案,这就是我问这个问题的原因之一。
  • 类似:[在迁移中指定自定义主键][1]。您可以使用 TEXT 代替 BIGINT 吗? [1]:stackoverflow.com/questions/6402189/…

标签: ruby-on-rails database ruby-on-rails-3 rails-migrations


【解决方案1】:

Here is 破解 mysql2 和 postgresql 中 bigint 主键的解决方案:

在 environment.rb 中:

    # Load the rails application
require File.expand_path('../application', __FILE__)

require 'active_record/connection_adapters/mysql2_adapter'
require 'active_record/connection_adapters/postgresql_adapter'

ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:big_primary_key] = "BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY".freeze
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:big_primary_key] = "bigserial primary key".freeze

# Initialize the rails application
YourAppName::Application.initialize!

【讨论】:

  • 非常感谢,一定会试试这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多