0

他のサーバーの新しいデータベースにロードしたい巨大な(1GB以上の)データベースダンプがあります。行ごとに解析してそれぞれをmysqlに実行しようとしましたが、残念ながら、行がコマンドに均等に分割されず、不完全なコマンドで失敗するだけです。

filename='/var/test.sql'
fp = open(filename)
while True:
        a = fp.readline()
        if not a:
           break
        cursor.execute(a) #fails most of the time

また、それを呼び出すためにすべてのものをメモリにロードするには大きすぎます。さらに、pythonMySQLdbモジュールはsourceコマンドをサポートしていません。

編集済み

ファイルには、一連の挿入ステートメントと作成ステートメントが含まれています。失敗するのは、生のテキストを含む大きなテーブルの挿入です。生のテキストにはあらゆる種類のセミコロンと改行が含まれているため、それに基づいてコマンドを分割するのは困難です。

4

3 に答える 3

1

クエリが行の境界で終了すると仮定すると、完全なクエリが作成されるまで行を追加するだけで済みます。

何かのようなもの:

filename='/var/test.sql'
fp = open(filename)
lines = ''
while True:
        a = fp.readline()
        if not a:
           break
        try:
           cursor.execute(lines + a)
           lines = ''
        except e:
           lines += a

挿入ステートメントのみの場合は、;で終わる行を探すことができます。次の行は「INSERT」で始まります。

filename='/var/test.sql'
fp = open(filename)
lines = ''
while True:
        a = fp.readline()
        if not a:
           break
        if lines.strip().endswith(';') and a.startswith('insert'):
           cursor.execute(lines)
           lines = a
        else:
           lines += a
# Catch the last one
cursor.execute(lines)

編集:置き換えられtrim()、2番目のコード例strip()の行を実行する必要がないことに気づきました。a

于 2011-05-13T12:19:48.693 に答える
1

あなたがあなたのためにそれをするためのプロセスを生み出すことができない理由は何ですか?

import subprocess

fd = open(filename, 'r')
subprocess.Popen(['mysql', '-u', username, '-p{}'.format(password), '-h', hostname, database], stdin=fd).wait()

パスワードがpsに公開されるので、少し調整することをお勧めします。

于 2011-05-14T18:48:38.097 に答える
0

時々、私たちは仕事を効果的に行うために他の方法を選ぶべきだと思います。私はこのようなものを大きなデータに使用することを好みます:http ://www.mysqldumper.net/

于 2011-05-14T18:10:23.413 に答える