Postgres的C库libpq文档介绍了一种更安全的方法来连接数据库,而不需要在源代码中指定密码。
我没有找到任何如何实现它的示例。如何让我的Postgre服务器使用这个文件?请帮忙。
Postgres的C库libpq文档介绍了一种更安全的方法来连接数据库,而不需要在源代码中指定密码。
我没有找到任何如何实现它的示例。如何让我的Postgre服务器使用这个文件?请帮忙。
您不需要将它导入到您的Python程序中。使用.pgpass
文件的目的在于它是一个受系统文件权限约束的普通文件,而像psycopg2这样的库所用到的libpq驱动程序将会在此文件中查找密码,而不是要求用户将密码写进源代码或者提示输入密码。
此外,该文件不是服务器端文件,而是客户端文件。所以,在*nix系统下,您应该有一个~/.pgpass
文件,其中包含您想要连接的各种凭据信息。
针对OP评论的编辑:
为了让psycopg2通过.pgpass
正确进行身份验证,需要完成两件主要事情:
psycopg2.connect
的字符串中不要指定密码.pgpass
文件中。例如,如果要使其工作于本地主机 5432 端口上,所有数据库都可供特定用户使用,则应向该用户的.pgpass
文件添加以下行:
localhost:5432:*:<username>:<password>
然后connect
调用将采用以下形式:
conn = psycopg2.connect("host=localhost dbname=<dbname> user=<username>")
下层的libpq驱动程序会利用.pgpass
文件获取密码,而psycopg2使用该驱动程序。
补充@khampson的答案,我只能在Windows中添加PGPASSFILE环境变量(并随后重新启动pycharm),即使我的pgpass文件位于默认位置(%APPDATA%\postgresql\pgpass.conf),才能使其正常工作。
好的。你要求 .pgpass 但是...
还有 "连接服务文件"
默认情况下,每个用户的服务文件名为 ~/.pg_service.conf。 可以通过设置环境变量 PGSERVICEFILE 来指定不同的文件名
请参考 https://www.postgresql.org/docs/15/libpq-pgservice.html
格式为 ".INI"。参数是连接参数。 例如:
# this is a comment in my service file
[a_service]
host=dbserver.loc
port=5432
dbname=thedbname
user=thebest
password=bho
application_name=ifyoulike
# Here is another service
[another_service]
host=etc
port=etc
通过psql访问:
psql service=a_service
通过psycopg2访问:
db = psycopg2.connect('service=a_service')
通过sqlalchemy访问:
eng = sqlalchemy.create_engine('postgresql:///?service=another_service')
#!/usr/bin/python
import psycopg2
import sys
import pprint
def main():
conn_string = "host='127.0.0.1' dbname='yourdatabsename' user='yourusername' password='yourpassword'"
print "Connecting to database\n ->%s" % (conn_string)
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute("SELECT * FROM tablename")
records = cursor.fetchall()
pprint.pprint(records)
if __name__ == "__main__":
main()
chmod 0600 ~/.pgpass
。如果权限比这更少,文件将被忽略。按照khampson的回答执行此命令对我来说解决了问题。 - Corey Levinsonpassfile
似乎无法找到它。 - thomi