2012-03-26 5 views
1

実行時にテストDBを作成しようとしていますが、正確な重複テストDBを維持する必要はありません。データ構造全体をコピーしたいと思います。実行時に私のプロダクションDBを開き、次にテストデータベースを閉じるとデータベース全体をドロップします。Mysql Sql文からデータベースをコピーする

は、私は私のようなステートメントを使用すると仮定します。

CREATE DATABASE test //to create the test db 
CREATE TABLE test.sampleTable LIKE production.sampleTable //to create each table 

をそして私はのような何かを実行しますcloseメソッドの呼び出し、テストデシベルを終えていたとき:

DROP DATABASE test //delete the database and all its tables 

しかし、どのように行うの手動で作成することなく、本番データベース内のすべてのテーブルを自動的に検索します。アイデアは、テストDB内で構造を同じように維持することを心配することなく、私の制作DBを操作できるということです。

この場合、ストアドプロシージャは必要ですか?このようなことを達成するためのサンプルコードのいくつかは高く評価されます。

+0

両方の場所で構造を維持するのではなく、[MySQLレプリケーション](http://dev.mysql.com/doc/refman/5.0/en/replication.html)でこれを行うことができるので、prod (データとスキーマ)がすぐにテストに同期します。 –

+0

MySQLの "SHOW TABLES"コマンドは、特定のデータベースの一時的でないテーブルを一覧表示します –

+0

データベース、テーブル、およびそれらのテーブル内のすべてのデータを複製にコピーしませんか?私のテストDBは空のテーブルを持つ必要があります、私はちょうどテーブル構造をコピーしたい。 – ryandlf

答えて

0

にソリューションを複製するために必要なすべてのSQLコマンドを含むファイルを生成しますhttp://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

を以下の通りであった:

private static final String SQL_CREATE_TEST_DB = "CREATE DATABASE test"; 
private static final String SQL_PROD_TABLES = "SHOW TABLES IN production"; 

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
jdbcTemplate.execute(SQL_CREATE_TEST_DB); 

SqlRowSet result = jdbcTemplate.queryForRowSet(SQL_PROD_TABLES); 
while(result.next()) { 
    String tableName = result.getString(result.getMetaData().getColumnName(1)); //Retrieves table name from column 1    
    jdbcTemplate.execute("CREATE TABLE test2." + tableName + " LIKE production." + tableName); //Create new table in test2 based on production structure 
} 

これは使用していますデータベース接続などを簡素化するためにSpringを使用しましたが、実際の魔法はSQL文にあります。 D Macが述べたように、これは外部キー制約をコピーしませんが、別のSQL文を実行して結果を解析することで実現できます。

0

スクリプト言語では、コピーするデータベースで「SHOW TABLES」を呼び出します。その結果を一度に読み込むと、プログラムはテーブルの名前を変数($ tablenameと呼ぶ)に入れ、sql: "CREATE TABLE test。$ tablename LIKE production。$ tablename"を生成することができます。結果セットを繰り返すと、完了です。

(外来キーの制約を受けることはありませんが、そのようなものは必要ありません。そうした場合、 "SHOW CREATE TABLE $ tablename"を実行して結果を解析して制約を選ぶことができます)。

私は、Javaのコードスニペットを持っているが、ここであなたは、擬似コードとして扱うことができperlのためのものであるしていない。

$ref = $dbh->selectall_arrayref("SHOW TABLES"); 
unless(defined ($ref)){ 
     print "Nothing found\n"; 
} else { 
     foreach my $row_ref (@{$ref}){ 
       push(@tables, $row_ref->[0]); 
     } 
} 

foreach文の繰り返し処理を返された配列参照の結果セットの上にデータベースインタフェースライブラリによって。 push文は、結果セットの現在の行の最初の要素を配列変数@tablesに格納します。ご使用の言語に適したデータベースライブラリを使用しています。

+0

テーブルの名前を変数に入れるにはどうしたらいいですか?私はJavaを使用しています。 – ryandlf

+0

@ryandlf、私はperlでスニペットを表示するために私の答えを編集 - 申し訳ありませんが、私はjavaのデータベースインターフェイスライブラリを知らない。 –

0

使用しているデータベースドライバでサポートされている場合は、DatabaseMetaData#getTablesを使用してスキーマのテーブルの一覧を取得できます。 DatabaseMetaDataにはConnection#getMetaDataからアクセスできます。

0

私は、mysqldumpを使用します。それは、PRODデータベース

関連する問題