2009-08-15 29 views
1

私はMySQLを使用するRailsアプリケーションを持っています。アプリケーションは、マスターmysqlデータベースからクライアントアプリケーションに配布されるsqliteデータベースにデータを格納する必要があります。 sqliteデータベースのスキーマは、mysqlデータベースと非常によく似ていますが、同一ではありません。 sqliteデータベースには、マスターmysqlデータベースに格納されているスキーマとデータのサブセットが設定されます。データサブセットは、http要求で渡されるパラメータによって決定されます。これは、メンテナンス操作ではなく、mysql dbのサブセットをsqlite dbとしてクライアントアプリケーションに配信することを意図しています。mysqlソースからsqliteデータベースを移植するためのRubyソリューションの提案

tapsを修正するか、sequelを使用してメタルアプリを作成して両方のデータベースに接続してデータを転送しようと考えていました。

他の提案はありますか?

答えて

2

免責事項:私はSequelのメンテナーです。

これを行うにはSequelが最も簡単な方法でしょう。 bin/sequelツールは、MySQLデータベースをSQLiteデータベースにコピーすることができるので、そのソースコード(http://github.com/jeremyevans/sequel/blob/205d8a04842c143736de76d645a2a955a1ca641f/bin/sequel)を見ると、Sequelでこれを行う方法を知ることができます。

物事が構築されるため、スキーマを直接コピーしてから不必要な列を削除するのが最も簡単です。あるいは、私が望むSQLiteデータベーススキーマを作成するためのコードを書くだけです。

データをコピーするコードはおそらく、bin/sequelにあるものの修正版を使用している可能性があります。

+0

これは非常に役に立ちます。ありがとうございました。 私は目標を達成するためにSequelとRails Metalを使用するルートを下ろすと思います。 –

0

あなたのレールアプリは、クライアントのためにオンデマンドでsqlite dbを作成していますか、このプロセスは帯​​域外のメンテナンスジョブですか?

メンテナンスジョブの場合は、mysql dbをダンプし、ダンプに置き換えてsqlite固有のものにし、最後にsqlite dbにインポートするシェルスクリプトを作成します。

+0

私は、クライアントアプリケーションに提供するために必要に応じて作成されたsqliteデータベースを作成しようとしています。マスターmysql dbからsqliteデータベースを生成すると、頻繁にサーバーに要求されます。 –

0

おそらく、あなたはyaml_db pluginを試みることができるし、それはrakeタスクを使用していますので、あなたはこれをしたcronを追加することができます:sqliteのDBを使用しています「ライト」環境のセットアップ

rake db:data:dump RAILS_ENV=production && rake db:data:load RAILS_ENV=lite 

を。

また、データを変更したい場合は、プラグインを少し変更することもできます。

+0

この度はありがとうございます。私はこれがhttpリクエストごとにsqlite dbにデータを取り込めなければならないという私の要求に対応するかどうかはわかりません。私が言及しなかったかもしれない別のことは、生成されたdbがhttp要求を通過するparamsに固有に生成されるということです。 –

1

両方のデータベースで同様のモデルで作業している場合、ActiveResourceの "attributes"メソッドはそのモデルの属性のハッシュを返し、 "attributes ="は属性ハッシュを受け取りますすべてのモデルの属性を含む)。これを念頭において、ActiveRecord :: Base.establish_connectionメソッドを利用して、両方のモデルを異なるデータベースに接続させることができます。モデルはすべてのフィールドを共有したり、Sqliteをモデルに割り当てる前に、いくつかの処理を必要としない場合は、元の属性のハッシュとプロセスを受け取る方法を構築することができ

MysqlModel.establish_connection(YAML.load_file(path_to_database_yml)) 
SqliteMode.establish_connection(YAML.load_file(path_to_other_database_yml)) 

MysqlModel.all.each do |m| 
    SqliteModel.create(m.attributes) 
end 

:あなたのような何かができるその方法Sqliteモデルの適切な属性ハッシュを返します。

+0

ありがとうございます。私はこれに似たようなことをやろうとしていますが、ActiveRecordではなくSequelと思っています。 –

関連する問題