1

最初的问题

在我的 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然后将迁移所做的添加与我自己的合并。有没有人有更好的主意?

4

1 回答 1

1

这是破解 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!
于 2012-08-22T13:28:22.130 回答