1

初期の問題

Railsアプリケーションでは、主キーとして多数のデータを使用して、レガシーデータベースのデータを処理する必要があります。MySQLPostgreSQLの両方の4バイトINTまたはINTEGERデータ型の制限を超える数。しかし、それはまさにRailsのアダプターが" integer"を変換するデータ型です。

私の回避策

SQLiteには大きな数値を受け入れる整数型が1つしかないため、これは開発では問題になりませんでした。しかし、ステージング/本番環境(つまり、 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 に答える