Rails迁移和非标准数据类型?

时间:2012-08-22 12:55:38

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

初始问题

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

我的解决方法

这不是开发中的问题,因为SQLite只有一个接受大数字的整数类型。但是对于登台/制作(即用于任何 SQLite),我必须手动编辑schema.rb文件以用t.integer "id"替换t.column "id", 'BIGINT'。然后加载模式,导入数据,它就可以工作。

解决方法的问题

现在,每当我运行Rails迁移以对数据库模式进行微小更改时,将自动重新生成整个schema.rb文件,并且我的所有id列都只是{{1}再次。和以前一样,这不是开发中的问题(SQLite),但它可能会在生产中,不是吗?我不想每次需要添加或重命名列时都必须删除数据库,加载模式并重新导入所有数据 - 我更倾向于使用迁移。

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

1 个答案:

答案 0 :(得分:1)

Here is解决mysql和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!