5

Python とサブプロセスを使用して、.sql ダンプをディスクから MySQL にインポートしようとしています。つまり、

mysql -u user -ppassword db < dump.sql

私のPythonコードは次のようになります(しかし、私はたくさんの代替案を試しました:)):

proc = subprocess.Popen(
    ("mysql -u %s -p%s database"  % (MYSQL_USER, MYSQL_PASSWORD)).split(),
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    shell=False)
out, err = proc.communicate('source /tmp/dump.sql')

アプリケーションは正常に終了しますが、MySQL にインポートされた行はありません。私も次のdump.sqlようにパイプを試しました:

proc = subprocess.Popen(
    ("mysql -u %s -p%s database < /tmp/dump.sql"  % (MYSQL_USER, MYSQL_PASSWORD)).split(),
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    shell=False)
out, err = proc.communicate()

重要な場合、設定shell=TrueするとERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO))

誰でも私を正しい方向に向けることができますか?

4

2 に答える 2

17

Google からこのページにアクセスした場合、sigi の回答は機能しますが、すべてのダンプ ファイルがメモリに読み込まれ、サイズが大きすぎて収まらない場合は失敗することに注意してください。

これが私がそれを行う方法です:

with open(dump_filename, 'r') as f: 
       command = ['mysql', '-u%s' % db_settings['USER'], '-p%s' % db_settings['PASSWORD'], db_settings['NAME']]
       proc = subprocess.Popen(command, stdin = f)
       stdout, stderr = proc.communicate()

同じことを行いますが、ダンプは mysql の stdin に直接ストリーミングされるため、メモリ消費は最小限に抑えられます。

于 2015-02-01T18:38:47.700 に答える
8

Popen.communicate() を間違って使用しています。

import subprocess

proc = subprocess.Popen(["mysql", "--user=%s" % USER, "--password=%s" % PASS, "database"],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE)
out, err = proc.communicate(file("/tmp/dump.sql").read())
于 2012-08-25T19:41:15.173 に答える