多个密码尝试pg_dump python

时间:2017-11-07 23:33:19

标签: python postgresql-9.3 pg-dump

我正在尝试允许我的脚本用户提示用户输入正确的密码(如果他们输入的密码无效)。我不确定这是一个psql配置还是通过使用python处理错误来完成的。我使用哪一个以及如何使用?我目前的代码如下:

 backup_ps = subprocess.Popen(
    ['pg_dump','-h', ORIGIN_DB, '-U', ORIGIN_DB_USER, ORIGIN_DB_NAME, '-f', destination, '-c',
     '-t', 'table1',
     '-Fp', '--inserts'],
    stdout=subprocess.PIPE
)

output = backup_ps.communicate()[0]

# if password incorrect, prompt for correct password.

1 个答案:

答案 0 :(得分:1)

我在FreeBSD上运行postgresql96。当我输入错误的密码时,pg_dump的返回码是1,而不是0。

一个天真的解决方案是将你的代码放在这样的while循环中:

while True:
    backup_ps = subprocess.Popen(
        ['pg_dump','-h', ORIGIN_DB, '-U', ORIGIN_DB_USER, ORIGIN_DB_NAME, '-f', destination, '-c',
            '-t', 'table1',
            '-Fp', '--inserts'],
        stdout=subprocess.PIPE
    )

    output = backup_ps.communicate()[0]
    if backup_ps.returncode == 0:
        break

问题是pg_dump可能会在任何错误上返回1,包括系统调用分配内存或磁盘空间失败时。因此,它实际上并不意味着密码输入失败,并且您可能希望在n尝试或使用其他内容后退出但没有成功返回。

另一种解决方案可能是检查转储输出文件是否存在并且最近是否已修改。您可能还需要检查stderr以查找有关密码错误的错误消息。

我认为这些解决方案很糟糕。

最好的解决方案(AFAICT)是不使用单独的进程来执行转储(因为那时与该进程通信可能会很麻烦),但是使用像psycopg2这样的Python库来访问数据库。