我正在尝试自动下载pg_dump文件并恢复这些文件。我在执行pg_restore
命令时遇到问题。我目前正在使用:
from subprocess import PIPE, Popen
import shlex
command = f'pg_restore '
f'-h {host} '
f'-d {database} '
f'-U {username} '
f'{file_path}'
command = shlex.split(command)
p = Popen(command, shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)
p.communicate(str.encode(f'r{password}r'))
但是,这会提示我填写密码(当我填写密码时,它工作正常(。
到目前为止我尝试过:
- 设置
shell = True
(在这种情况下,我收到错误[Info] 2019-12-09 14:59:55 - [root] (b'', b'pg_restore: [archiver] input file does not appear to be a valid archive (too short?)n')
( - 使用 传递密码
p.stdin.write(f'{self.push_password}n')
p.stdin.flush()
- 使用
n
而不是r
- 只在
p.communicate
结束时通过r
我没有想法,不知道该怎么办。有谁知道如何在从 python 调用pg_restore时自动传递我的密码?
两种方式。
设置环境变量:
PGDATABASE, PGHOST, PGPORT and/or PGUSER
在文件中设置
密码可以放在一个文件中,postgresql 会拿起它
文档
当默认值不太正确时,您可以通过将环境变量 PGDATABASE、PGHOST、PGPORT 和/或 PGUSER 设置为适当的值来节省一些类型。(有关其他环境变量,请参见第 30.12 节。拥有一个~/.pgpass文件也很方便,以避免经常输入密码。有关更多信息,请参见第 30.13 节。
更多: https://www.postgresql.org/docs/8.3/app-psql.html
此处讨论:如何以非交互方式为 psql 指定密码?