2012-05-09 4 views
0

OpenCartからDrupal 7へのデータ移行を行っています。私はDrupal 7専用のプライマリデータベースを用意しています。同じサーバー上にセカンダリデータベースを作成しました。これは、移行するOpenCartデータベースのコピーです。Drupal 7を使用してセカンダリデータベースへの偶発的な呼び出しを実行するのが難しい

重複するテーブルがたくさんあるので、私はこれを行いました。正直なところ、製品と関連情報が移行された直後にOpenCartをダンプするので、2つのデータベースをマージする必要はありませんでした。

とにかく、私は、Drupal 7がこれを簡単にサポートしているにもかかわらず、セカンダリDBで任意のクエリを実行しようとすると2番目のものを駄目にしているようです。私が「死の白いスクリーン」を意味するのはうんざりです。 develモジュールのdbクエリーロギングを有効にすると、WSODのその情報のフォーマットされていない行がいくつか出力されます。

以下は、これを行うために使用しているコードのサンプルです。ご覧のとおり、単純なselect文でさえ、完全に爆撃します。なぜ誰かがこれが起こっているかもしれないという考えを持っていますか?

私は本当にこの作業を行い、移行モジュールを使ってやりたいと思います。しかし、私は手を振って、データベースに接続してすべてのデータを巨大なXMLファイルとして出力し、マイグレーションモジュールがそれを処理できるようにする(または、集計されたデータをtempある時点でのテーブル)。

$query = Database::getConnection('opencart', 'opencart')->query("SELECT * FROM product"); 

if ($query != NULL) { 
    $row = $query->execute()->fetchObject(); 
    echo "<pre>" . print_r($row, true) . "</pre>"; 
    echo "<pre>" . print_r($query, true) . "</pre>"; 
} 
else { 
    echo "Query is NULL."; 
} 
+0

WSODの原因をサーバーエラーログで確認してください。それ以外のものは、単に「暗闇の中で突き刺す」推測です。 –

+0

ウォッチドッグログをチェックして何も見つかりませんでした。しかし、他のログが生成されているかどうかを確認します。 – pthurmond

+0

ウォッチドッグログは、エラーが発生しても実行が続行される場合にのみ書き込むことができます.WSODの場合はそうではありません。あなたのPHP実行環境からログを探したいかもしれません。サイトのApacheエラーログ、サイトがApacheによって提供されている場合、または異なる設定の場合は同等のものです。 –

答えて

1

私は前にこれをやった方法:あなたの$データベース配列に二デシベルを含むように

の1-編集してアクティブのsettings.phpファイルを。だから、あなたは、あなたのアクティブなデータベースを切り替えるようにしてくださいdb_query() sおよびおそらくdb_select()の同類など

、3-を実行することができdb_set_active('secondary');使用し、あなたのコードで

$databases = array(
    'default'=> array(...), 
    'secondary' => array(...), 
); 

2 - のようなものを持っていると思いますできるだけ早くデフォルトに戻してください。デフォルトのデータベースに戻る前に行う関数呼び出しに注意してください。 t()のような多くの呼び出しは、デフォルトのデータベースを必要とし、それを無効にします。

+0

私はあなたのリストにすでにステップ1を持っています。しかし、ステップ2の私の懸念は、移行モジュール内での使用です。それは結果セットではなくクエリオブジェクトを渡す必要があります。これは、マイグレーションの前に事前に結果を数えたいからです。 – pthurmond

+0

また、D6でこれを行った別の開発者からこのデータベースの切り替えについて聞いたことがあります。しかし理論的には、D7は複数の同時接続をサポートします。だから私はなぜ私にも最初に問題を与えているのか分かりません。 – pthurmond

+0

照会オブジェクトを必要とし、結果セットを必要としないマイグレーション・モジュールを作成するかどうか不明です。あなたが提供するAPIを使用していますか?私はそのUIだけを使用しました。とにかくクエリオブジェクトを渡してみましたか?いずれにせよ、私はWSODに遭遇したときにログをチェックすることに関して、上記の@henrikと非常に同意します。 –

1

私は結局、同僚の助けを借りてこれを理解しました。問題はカップルのものでした。最初にquery()関数をDatabase :: getConnection()に連鎖させていたとき、私はexecute()関数を実行しようとしていました。しかし、query()関数はそれをサポートしていません。代わりに、$ query varの最後にfetchAssoc()を実行するだけでした。

この複雑なクエリを実行するためにデータベース抽出レイヤーを使用しようとしたとき、私はいくつかの関数が返すもののために間違って構築していました。使用しようとしていたjoinおよびaddExpression関数は、クエリオブジェクトを変更してもエイリアスのみを返します。それらをインラインでチェーンしようとしていましたが、できません。だから代わりに、オブジェクト上でそれらの関数を一度に1つずつ自分の非連鎖線で呼び出すことによって、それらを機能させることができました。私はまだ私が使用していたフィールドとグループをつなぎ合わせることができました。

マイグレーションモジュールを使用するには、データベース抽象化レイヤーに戻って上記の変更を加えました。

ご協力いただきありがとうございます。

関連する問題