4

中程度の量の検索で何も返されなかった後、私がよくある問題だと思ったことについて。異なるテーブルを持つ複数の mysql サーバーがあり、それぞれがマスターまたは読み取りスレーブのいずれかです。すべての SELECT およびその他のテーブルを変更しないクエリを読み取りスレーブを介してルーティングし、その他すべての INSERT、UPDATE、ALTER などをルーティングしたいと考えています。マスターに接続するだけでなく、正しいマスタースレーブコンボに実際に私が求めているテーブルがあることを確認してください。

TLDR :テーブルとクエリの種類 (読み取りまたは書き込み) に基づいて、別の mysql 接続を使用したいと考えています。

これをきれいな方法で行うために、クエリを調べて使用する接続を決定するラッパー関数を作成しています。この関数には、どのテーブルがどのサーバー上にあり、どれがスレーブまたはマスターの読み取りであるかについての詳細が表示されます。渡すのは、SQL ステートメントを含む文字列だけです。正規表現を使用してこれを実装する方法は知っていますが、組み込み関数が存在する場合は、SQL 構文の可変性や未知のステートメント タイプの可能性を考慮して、組み込み関数を使用することをお勧めします。

TLDR : SQLクエリの文字列からテーブル名とクエリタイプを取得するための正規表現よりも良い方法はありますか? 読み取りタイプの SQL 操作の完全なリストは何ですか? SQLクエリのすべてのバリエーションについて、SQLステートメントの一部を見つけるための適切な正規表現をすでに持っている人はいますか?

多くの人がシステムをセットアップする際に同様の問題に直面し、少なくとも一部の人は同様の方法で問題を解決したと思います。これらの指示のいずれかに関するヘルプをいただければ幸いです。御時間ありがとうございます。

4

2 に答える 2

1

DoctrinePropelのような ORM がこのような状況に対処する方法は、各テーブルを接続に関連付けてから、クエリ オブジェクトを使用して結果の SQL を構築することです。

たとえばSELECT、Doctrine でクエリを作成するには、次のようにします。

$users = UserTable::getInstance()
  ->createQuery()                      // SELECT is the default operation.
  ->andWhere('is_active = ?', $active)
  ->fetch();

このようにクラスを使用してピース単位の方法でクエリを作成する場合、操作の性質とクエリのプライマリ テーブルを決定するのは非常に簡単です。

于 2012-05-12T22:51:47.453 に答える