在我的Rails应用程序中,我需要处理来自旧数据库的数据,其中大数字作为主键。超过MySQL和PostgreSQL的4字节INT或INTEGER数据类型限制的数字。但这正是Rails的适配器将“integer
”翻译成的数据类型。
这不是开发中的问题,因为SQLite只有一个接受大数字的整数类型。但是对于登台/制作(即用于任何但 SQLite),我必须手动编辑schema.rb
文件以用t.integer "id"
替换t.column "id", 'BIGINT'
。然后加载模式,导入数据,它就可以工作。
现在,每当我运行Rails迁移以对数据库模式进行微小更改时,将自动重新生成整个schema.rb
文件,并且我的所有id
列都只是{{1}再次。和以前一样,这不是开发中的问题(SQLite),但它可能会在生产中,不是吗?我不想每次需要添加或重命名列时都必须删除数据库,加载模式并重新导入所有数据 - 我更倾向于使用迁移。
到目前为止,我的解决方法是在迁移之前制作t.integer
的备份副本,然后将迁移所做的添加与我自己的添加合并。有没有人有更好的主意?
答案 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!