0

OpenCart から Drupal 7 へのデータ移行を行っています。Drupal 7 専用にセットアップされたプライマリ データベースがあります。Drupal がインストールされています。移行元の OpenCart データベースのコピーであるセカンダリ データベースを同じサーバー上に作成しました。

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

とにかく、Drupal 7 はこれを簡単にサポートしていますが、セカンダリ DB でクエリを実行しようとするとすぐに失敗するようです。がらくたとは、「死の白い画面」がらくたを意味します。devel モジュールの db クエリ ログを有効にすると、WSOD にフォーマットされていない数行の情報が出力されます。

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

私は本当にこれを機能させ、migrateモジュールでそれをやりたいと思っています. しかし、私は手を挙げて、データベースに接続し、すべてのデータを巨大な XML ファイルとして出力するカスタム スクリプトを作成し、migrate モジュールがそれを処理できることを期待します (または、集約されたデータを一時ファイルにインポートします)。ある時点で表)。

$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.";
}
4

2 に答える 2

1

私が以前にこれを行った方法は次のとおりです。

1- アクティブな settings.php ファイルを編集して、$databases 配列にセカンダリ データベースを含めます。だからあなたは次のようなものを持っているでしょう

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

2- コード内で を使用してから、 や、場合によっては などをdb_set_active('secondary');実行できます。db_query()db_select()

3-アクティブなデータベースをできるだけ早くデフォルトに戻すようにしてください。デフォルトのデータベースに戻す前に行う関数呼び出しに注意してください。t() のような多くの呼び出しは、デフォルトのデータベースを必要とし、それがアクティブでないことを台無しにします。

于 2012-05-09T06:00:59.873 に答える
1

同僚の助けを借りて、ついにこれを理解しました。問題はいくつかありました。最初に query() 関数を Database::getConnection() にチェーンしていたとき、次に execute() 関数を実行しようとしていました。しかし、query() 関数はそれをサポートしていません。代わりに、$query 変数の最後で fetchAssoc() を実行するだけで済みました。

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

そのため、移行モジュールで動作させるために、データベース抽象化レイヤーの使用に戻し、上記の変更を加えました。

皆様の有益な提案に感謝いたします。

于 2012-05-09T19:43:40.753 に答える