首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子进程导入SQL转储

问使用子进程导入SQL转储
EN

Stack Overflow用户
提问于 2012-08-26 03:24:26
回答 2查看 7.8K关注 0票数 4

我正在尝试通过Python和子进程将.sql转储从磁盘导入到MySQL中。即等效于

代码语言:javascript
复制
mysql -u user -ppassword db < dump.sql

我的Python代码看起来像这样(但我已经尝试了很多替代方法:):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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))

有谁能给我指个方向吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-26 03:41:15

您错误地使用了Popen.communicate()。

代码语言:javascript
复制
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())
票数 8
EN

Stack Overflow用户

发布于 2015-02-02 02:38:48

如果您从Google访问此页面,请注意,sigi答案将有效,但它会将所有转储文件加载到内存中,如果它太大而无法容纳,它将失败。

我是这样做的:

代码语言:javascript
复制
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。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12124959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档