簡體   English   中英

使用子進程導入SQL轉儲

[英]Import SQL dump with subprocess

我正在嘗試通過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)

有誰能指出我正確的方向?

如果你從谷歌來到這個頁面,請注意,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。

您正在使用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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM