2011-12-03 5 views
0

Rubyスクリプトを使用してLOAD DATA LOCAL INFILE MYSQLからCSVファイルをインポートして構築された一連のテーブルからデータを提供する実動Railsアプリケーションがあります。テーブルには一貫して名前が付けられ、スキーマは変更されません。スクリプトはテーブルとスキーマを削除/作成し、データをロードします。定期的に再作成される実稼働中のRailsアプリケーションで、一連のmysqlテーブルを管理するにはどうすればよいですか?

しかし、私はデータの変更をどのように管理するかを再確認したい。 (1)ユーザーの要求に対応するアプリケーションを中断することなくデータ更新を頻繁にプッシュし、(2)新しいデータセットを「テスト可能」にすることができます。 (何かが間違っていた場合、前のテーブル/データにロールバックする機能を備えています)。

私が考えているのは、「バージョン」のテーブルを保持し、新しい再構築が行われるたびにレコードを作成することです。最新のバージョンIDはdatabase.ymlに詰め込まれ、各モデルはdatabase.ymlからテーブル名を指定できます。スクリプトは、古いバージョンを破棄することなく、新しいインポートですべてが正常であることを確認するために、バージョンを前進または後退させることができます。

これは良いアプローチですか?このようなパターンは既にありますか?それはRailsの移行にいくぶん類似しているようです。この種のデータ管理に役立つプラグインや宝石はありますか?

UPDATE /現在の解決策:database.ymlの設定を作成してインポート時にテーブルを作成しました。データは環境に基づいて変更されないため、環境固有の設定の「ピア」です。更新する唯一の4つのモデルがあるので、私は明示的にデータベース接続を追加しました:

establish_connection Rails.configuration.database_configuration["other_db"]

移行とクエリがレールと、通常のように動作し、この道を。インポートを実行し続けるには、インポートごとに個別の設定でデータベース名を更新します。この方法で以前のデータベースバージョンを手動で指定し、問題が発生した場合はアプリケーションを再起動することができました。

config = YAML.load_file(File.join("config/database.yml")) 
config["other_db"]["database"] = OTHER_DB_NAME 
File.open(path, 'w'){|f| f.write(config.to_yaml)} 

答えて

0

1つのオプションは、ソフト削除または "アクティブ"列を使用することです。レコードの置換/削除時期を知る必要がある場合は、インポートされた日付と削除された日付の列を追加することもできます。新しいデータをロードすると、デフォルトで「アクティブ」がfalseになります。アプリケーションは、本番アプリケーションとは異なるクエリを使用して新しく読み込まれたデータをプレビューすることができます。また、新しいデータを宣伝する準備ができたら、プロダクションアプリケーションが変更をアトミックに取得できるようにします。

これは、複数のテーブルを維持しようとするよりも簡単になりますが、以前に削除された行だけインポートされたが、アクティブにされていない受信行を分離周り、いくつかの複雑さがあるでしょう。

関連する問題