2016-06-18 7 views
-3

現在、MySQLデータバックエンドを使用してC++でサーバーソフトウェアを開発中です。私はofficial MySQL/connector library from Oracleを使ってMySQLを操作しています。接続そのものは機能しており、私はそれに問題はありません。
私の問題は、データベースとテーブルのスキーマは、新しいテーブルとカラムが追加され続けるため、しばらくの間変わる傾向があることです。また、同じ理由で終了列が変更されることがあります。時代遅れのサーバーソフトウェアをすばやく認識できるように、データベースが変更されたときに警告を追加したかったのです。
私の最初のアイデアは、データベース(およびテーブルなど)の外観をハードコードし、現在のデータベースがハードコードされたデータと一致するかどうかをチェックすることでした。しかし、私はそれを達成する方法を知りません。私はテーブルが正しいスキーマを持っているかどうかチェックする

  • テーブルは、テーブルの列を追加または
  • を除去されたかどうかを検出できるようにする要約

  • を変更されたテーブルの列が追加されましたか削除されました

できるだけC++コードを少なくしました。また、維持するのも非常に簡単です。

必要に応じて追加情報が追加されます。

+1

"必要に応じて追加情報が追加されます。" - !。?それは良い質問がされる方法ではありません –

+0

スキーマのバージョン管理を有効にするために、いくつかのメタ情報を追加 –

+0

πάνταῥεῖ@私はそれをどのように行うだろう – BrainStone

答えて

1

私は次のようなアプローチを示唆している:)

1をフォークとmysqlコマンドラインクライアントを実行します。 mysqlの標準入力と出力に一対のパイプを設定します。

2)この時点で、標準入力パイプを介してmysqlにパイプして単純なコマンドを実行し、標準出力パイプから出力を読み取ることができるはずです。

各mysqlコマンドの出力形式については注意が必要です。出力の読み込みが完了したことを知り、次のコマンドを送信できます。

3)の存在の最初の順序として、実行:

show tables; 

データベース内のすべてのテーブルを一覧表示します戻ってくる出力。出力をテーブル名のリストに解析することはtrivalです。テーブルごとに実行します。

show create table <tablename>; 

結果の出力には、テーブル内のすべてのフィールド、そのキー、および制約が表示されます。このテーブルのスキーマのほとんどすべて。すべてのテーブルについて、泡立て、繰り返してください。

4)この方法で、データベース全体の基本的なスキーマをキャプチャして比較することができます。必要に応じて、同じアプローチを使用してトリガーやその他のオブジェクトをキャプチャします。おそらくデータのマイナーなマッサージを行い、数ビットを除外する必要があります。たとえば、 "show create table"には現在のAUTO_INCREMENTの値が含まれますが、無視することができます。

標準的な入力と出力を使ってmysqlプロセスを駆動するこの一般的なアプローチは、もちろん揺らめきやすいものです。ちょっとした作業で、mysqlのネイティブクライアントライブラリを使用して、これらのコマンドをすべて実行し、結果を直接取得することができます。これはより信頼性が高くなければなりません。

+0

は、MySQL /コネクタ(https://dev.mysql.com/doc/connector-cpp/en/)私は 'mysql'クライアントを使用せずにクエリを行うことができません。しかし、私は確かにこれを試してみます。 – BrainStone

+0

何かおかしなことをした後、私はあなたの提案が完璧に働いていると言わなければなりません!また、実際にC++ソリューションを提案していただき、ありがとうございます。 – BrainStone

関連する問題