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 的标准输入的。

于 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 回答