2011-05-17 9 views
1

I've exported my MySQL database to a .txt/.sql file (link)このデータベースを使用して、他のコンピュータでデータベースを再構築する必要があります。 HeidiSQLでスクリプトを実行しても問題はありませんが、アプリケーションを起動する前にすべてのテーブルが存在し、正しいことを確認したいと思います。PythonでMySQLの組み込みコードを解析するには?

ビルドコードをPythonコードに貼り付けてコピーすることはできますが、エクスポートはデータベースの直接的な表現であり、コピー貼り付けの際にはエラーを含んではいけません。代わりにファイルの解析を試みましたが私の構文解析スキルは、たくさん残されています。ここで

は、コードの抜粋です:だから dataが既に作成されたデータベースを想定し

CREATE TABLE IF NOT EXISTS `data` (
    `dataid` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `measurementid` int(10) unsigned NOT NULL DEFAULT '0', 
    `frame` int(10) unsigned NOT NULL, 
    `sensor_row` int(10) unsigned NOT NULL, 
    `sensor_col` int(10) unsigned NOT NULL, 
    `value` float unsigned NOT NULL, 
    PRIMARY KEY (`dataid`), 
    UNIQUE KEY `measurementid_frame_sensor_row_sensor_col` (`measurementid`,`frame`,`sensor_row`,`sensor_col`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

が、私があればすべての必要なテーブルを構築して、コードを解析し、を作成する方法を探しています彼らドン変更されている場合はを変更してください。

これにアプローチする方法についてのご意見はありますか?

+0

SQLエクスポート文をphpmyadminに貼り付けます。 (これは、あなたがスクリプトを作成して男の回を繰り返そうとしている仕事でない限り)。 – Ian

+0

@Ian、私はまだアプリケーションとデータベースを頻繁に変更して調整していますが、アプリケーションをテストするすべての人が技術的に十分ではないので、正しく実行されていることを確認したいと思います。 –

+0

その場合、あなた自身で変更を適用する必要があります。変更した内容を作業中にテキストファイルに記録し、コードのリリースを適用するときに適用します。 GITのようなVCSを使ってリリースを真っ直ぐに保つことを強くお勧めします。 – Ian

答えて

2

あなただけのpythonデータベースアダプタを介して、完全に直接ファイルからSQLを実行することができます

import MySQLdb 
sql_dump = open('builtcode.sql', 'r').read() 

conn = MySQLdb.connect(db='soans', passwd='*****') 
cur = conn.cursor() 

cur.execute(sql_dump) 

cur.connection.close() 

付与:

mysql> show tables; 
+-----------------+ 
| Tables_in_soans | 
+-----------------+ 
| anamnesis_main | 
| averagecontact | 
+0

私は彼がSQLスクリプトを読んで、それらが存在するかどうかに応じて条件付きでテーブルを作成/変更したいと考えています。 – samplebias

1

は、単にファイルを読み込み、SQL文字列

私はあなたがする必要がある他に何についての混乱を実行します。テーブルがすでに存在する場合、create tableステートメントは実行されません。どんなalter文も実行されます。

現在のスキーマを更新しようとしているスキーマと比較する必要がある場合、これはファイルの「解析」よりも難しい問題です。何らかの種類の移行フレームワークdjangoのための南は私のお気に入りの一つです)またはスキーマ比較ツールです。

+0

ファイルを読む方法を教えてください。私はどのようにファイルを別々のSQL文字列に分割するのか分からなかったからです。スキルを比較する方法についての詳しい情報はありますか?私はスキルを経験していません。 –

+0

SQL文はセミコロンで区切られていますが、そうではありませんか?個別に実行する必要はありません。ファイルを開いて読み込み、文字列を実行するだけです。限り、スキーマを比較すると、それははるかに複雑な問題は、stackoverflow答えをカバーすることができるよりも。スキーマやデータ比較ツールを備えたSQLツールを作るソフトウェア企業の業界全体が存在します。 – marr75

+0

ああ、私はそれが容易であることを知らなかった。私はread + executeを試みましたが、それは完全に機能しました。スキーマの部分については、テーブルが同じでない場合(データを保持する必要はない)、テーブルを削除して再構築するだけです。 'すべての変更文が実行されます.'それは私の作成したコードと同じで、何かが違うときだけ変更するのでしょうか? –

1

sqlparse moduleを試してファイルを個々のステートメントに分割し、それぞれを実行することができます。

高度な方法でSQLトークンを操作することもできます(例:stripping out all comments (except those inside functions))。この手法を使用して、CREATE TABLEステートメントからテーブル名を解析し、そのテーブルの存在を確認することができます。

ここで分割までのステートメントの例です:

import sqlparse 

queries = ''' 
CREATE TABLE foo (id INTEGER); 
CREATE TABLE bar (id INTEGER, name VARCHAR); 
SELECT foo FROM bar WHERE id IN (1,2,3); 
DELETE FROM bar WHERE id IN (3, 4); 
-- a comment 
DELETE FROM bar WHERE name IN ('chaos','atlas'); 
''' 

for i, stmt, in enumerate(sqlparse.split(queries)): 
    sql = stmt.strip() 
    if not sql: 
     continue 
    print i, sql 

は出力:

0 CREATE TABLE foo (id INTEGER); 
1 CREATE TABLE bar (id INTEGER, name VARCHAR); 
2 SELECT foo FROM bar WHERE id IN (1,2,3); 
3 DELETE FROM bar WHERE id IN (3, 4); 
4 -- a comment 
DELETE FROM bar WHERE name IN ('chaos','atlas'); 
+0

ありがとうございました。 –

+0

ビルドコードでコードサンプルを試してみると、別のステートメントではなく大きなブロブが返されます。どのようにそれを調整する任意のアイデアは、それは別のSQL文を返すだけですか? –

関連する問題