繁体   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