我在Python中编写了两个小函数来从控制台调用mysqldump
和mysql
,因此我可以创建数据库备份然后将其恢复:
# Makes a backup current database status
def backupDatabase():
if(os.path.exists('myDatabaseBackup.sql')):
os.remove('myDatabaseBackup.sql')
call(['mysqldump', '-u myUsername myDatabase > myDatabaseBackup.sql'])
# Restores database
def restoreDatabase():
call(['mysql', '-u myUsername myDatabase < myDatabaseBackup.sql'])
然而,他们没有工作。我已经读过调用获取两个值:可执行文件和参数,但它看起来忽略了参数,因为调用backupDatabase后的输出是:
用法:mysqldump [OPTIONS]数据库[tables]或...对于更多选项, se mysqldump --help
怎么了?我知道我可以使用Pipes
(我不知道目前是怎样的,只知道它们存在并且是另一种选择),但由于这看起来非常简单,我想subprocess.call
应该足够了。那么,是否可以使用subprocess.call
解决此问题? (如果没有,请为Pipes
或任何其他解决方案提供一些帮助。)
另外,我正在使用MySQLdb
包用于其他目的,因此如果可以使用此包进行备份和恢复,那就太棒了。
答案 0 :(得分:2)
首先,subprocess.call
希望您分别传递每个命令行参数,如下所示:
subprocess.call(['mysqldump', '-u', 'myUsername'])
其次,要重定向输出,您需要传递额外的stdout
参数,其中包括一个打开的文件对象:
with open('myDatabaseBackup.sql', 'w') as fout:
subprocess.call(['mysqldump', '-u', 'myUsername'], stdout=fout)
(对于第二次重定向,您自然会使用stdin
。更多详情请见FAQ)
答案 1 :(得分:1)
shell处理重定向运算符<
和>
。如果没有shell,它们将无法工作。
尝试将shell=True
传递给call()
:
call(['mysqldump', '-u myUsername myDatabase > myDatabaseBackup.sql'], shell=True)
call(['mysql', '-u myUsername myDatabase < myDatabaseBackup.sql'], shell=True)