我有下面的Python代码可以在本地生成一个转储文件。当我使用pg_dump命令时,我想在没有数据库连接提示密码的情况下将其停靠,而且我也不知道我会在dockerfile中给出什么来代替postgres_bin = r "C:\Program Files\PostgreSQL \13\bin"
import os
import paramiko
import subprocess
postgres_bin = r"C:\Program Files\PostgreSQL\13\bin"
dump_file = "database_dump.sql"
with open(dump_file, "w") as f:
result = subprocess.call([os.path.join(postgres_bin, "pg_dump"), "-Fp", "-d", "XXX", "-U", "XXX", "-h", "XXX", "-p", "XXX"], stdout=f)
transport.close()
此代码在本地工作。我希望有相同的代码工作,而不必在提示中给出密码,我有本地。
我该怎么做呢?
---更新----
我更新了下面的代码。这段代码可以在提示符下工作。但是当我用"-w"和env = {'PGPASSWORD '取消注解时:'secret '}出现主机名无法转换的错误:未知服务器错误。
import os
import paramiko
import subprocess
print("Import has been done !")
postgres_bin = r"C:\Program Files\PostgreSQL\13\bin"
dump_file = "database_dump.sql"
with open(dump_file, "w") as f:
result = subprocess.call([
os.path.join(postgres_bin, "pg_dump"),
"-Fp",
"-d",
"anonymedev",
"-U",
"pgsqladmin",
"-h",
"hostname",
"-p",
"32045",
# '-w'
],
# env={'PGPASSWORD': 'secret'},
stdout=f
)
1条答案
按热度按时间hxzsmxv21#
您可以使用
PGPASSWORD
或PGPASSFILE
环境变量,如the documentation中所述。例如,要以用户“postgres”和密码“secret”的身份转储数据库“example”,我可以编写:
我可以将密码存储在一个文件中,而不是使用
PGPASSWORD
环境变量;在这种情况下,我们需要按照“The Password File“中的描述格式化文件:然后使用
PGPASSFILE
环境变量引用该文件:如果你在Python中运行
pg_dump
,那么为了设置一个环境变量,你需要在os.environ
中设置键,或者使用subprocess.call
的env
参数。使用
env
参数为单个subprocess.call
调用设置环境,如果希望现有环境变量在子进程中可见,则必须显式包含这些变量:(Note这里的
dict
union syntax需要Python 3.9或更高版本)。或者,您可以更新
os.environ
,这将使变量可用于所有后续子进程: