1

MySQL データベースの状態 (テーブル構造、内容など) を取得する必要があるテスト フレームワークを作成しています。

特定の操作後に状態が変更されていないことを確認するために、これが必要です。(オートインクリメントの値は変更できるかもしれませんが、私はこれを処理できると思います。)

ダンプは、できれば人間が読める形式にする必要があります (できれば、mysqldump のように SQL コードにする必要があります)。

テスト フレームワークを MySQL 接続のみを使用するように制限したいと考えています。状態をキャプチャするために、 mysqldump を呼び出したり、ファイルシステムにアクセスしたりしないでください(*.frm ファイルをコピーしたり、ファイルに SELECT INTO を実行したりするなど、パイプは問題ありません)。

これはテスト専用のコードなので、パフォーマンスは気にしません。ただし、信頼できる動作が必要です。

必要な機能を実装する最良の方法は何ですか?

既存のオープン ソース バックアップ ツールのいくつかに基づいてコードを作成する必要があると思います...どれを調べるのが最適ですか?

更新:コードをそのまま再利用できるとは思わないため、これを記述する言語を指定していません (いや、それは PHP ではありません)。 C API)。コードは Linux で実行されます。

4

3 に答える 3

2

あなたの要件を考えると、私はあなたが(擬似コード+ SQL)を残されていると思います

tables = mysql_fetch "SHOW TABLES"
foreach table in tables
    create = mysql_fetch "SHOW CREATE TABLE table"
    print create
    rows = mysql_fetch "SELECT * FROM table"
    foreach row in rows
        // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables)
        insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)"
        print insert

基本的に、すべてのテーブルのリストをフェッチしてから、各テーブルをウォークINSERTし、各行のステートメントを手動で生成します(ほとんどのAPIには、列名のリストをフェッチする簡単な方法があります。それ以外の場合は、呼び出しにフォールバックできますDESC TABLE)。

SHOW CREATE TABLEはあなたのために行われますが、それに類似したものは何もないと私はかなり確信していますSHOW INSERT ROWS

そしてもちろん、ダンプを印刷する代わりに、それを使ってやりたいことが何でもできます。

于 2010-01-09T06:54:53.347 に答える
1

コマンド ライン ツールを使用したくない場合、つまり、たとえば php または使用している言語で完全に実行したい場合は、SQL 自体を使用してテーブルを反復処理しないでください。たとえば、テーブル構造を確認するには、SHOW CREATE TABLE table_name を使用してテーブル構造のスナップショットをキャプチャし、結果を保存してから、後で再度呼び出して結果を比較するという簡単な方法があります。

mysqldump のソース コードを確認しましたか? あなたが望むもののほとんどはその中に含まれていると確信しています。

DC

于 2010-01-08T00:41:33.400 に答える
0

自分でエクスポートを作成しない限り、データをエクスポートして検証するための簡単な解決策はないと思います。テーブルごとに行う場合は、LOAD DATA INFILESELECT ... INTO OUTFILEが役立つ場合があります。

テストごとにデータベースを再構築する方が簡単だと思います。少なくとも、データの正確な状態を知ることができます。もちろん、これらのテストを実行するにはより多くの時間がかかりますが、操作を抽象化し、データベースに依存するテストの作成を減らすことは良い動機になります。

InnoDB やその他のトランザクション データベース エンジンを使用して、設計上このような適切な分割が許可されていない一部のプロジェクトで使用する別の方法はうまく機能します。トランザクションを追跡するか、テスト中にトランザクションを無効にしている限り、単純に setUp() でトランザクションを開始し、tearDown() でロールバックできます。

于 2010-01-08T00:43:27.613 に答える