使用psycopg2连接PostgreSQL遭拒绝:FastAPI无法连接已运行数据库
核对psycopg2连接参数
把TablePlus里的连接参数(主机、端口、用户名、密码、数据库名)原封不动写到测试代码里,避免拼写错误。比如:import psycopg2 try: conn = psycopg2.connect( host="127.0.0.1", port=5432, user="你的用户名", password="你的密码", dbname="你的数据库名" ) print("连接成功") conn.close() except Exception as e: print(f"错误: {e}")在FastAPI的虚拟环境里单独运行这段代码,如果报错,说明参数或环境有问题;如果成功,再检查FastAPI应用里的连接逻辑是否存在参数覆盖。
验证PostgreSQL实际监听端口
查看postgresql.conf里的port配置项,确认是否为5432。也可以执行ps aux | grep postgres,查看启动参数里是否指定了其他端口。另外,确保PostgreSQL是完全重启后的状态——执行pg_ctl stop -m fast彻底停服后,再用pg_ctl start重启,避免旧进程残留导致端口冲突。尝试Unix Socket连接
TablePlus可能默认用Unix域套接字连接(而非TCP/IP),而psycopg2指定TCP连接引发异常。可以把psycopg2的host参数改成PostgreSQL的套接字路径,比如:conn = psycopg2.connect( host="/var/run/postgresql", # macOS系统通常是/tmp,可在postgresql.conf的unix_socket_directories项查看 user="你的用户名", password="你的密码", dbname="你的数据库名" )检查虚拟环境依赖
确认FastAPI使用的虚拟环境里,psycopg2(或psycopg2-binary)正常安装。可重新安装依赖:pip uninstall psycopg2 psycopg2-binary pip install psycopg2-binary部分情况下,依赖包损坏会导致连接异常。
排查容器环境(如果使用)
若在容器内运行uvicorn,127.0.0.1指向容器内部,而非宿主机的PostgreSQL。此时需将连接host改为宿主机IP(如192.168.x.x),或在Docker运行时添加--network=host参数,让容器共享宿主机网络。
内容的提问来源于stack exchange,提问作者Vansh

