Heroku PostgreSQL进程退出崩溃:Python代码暴露数据库问题排查
问题根源
Heroku的worker dyno设计用于运行长期后台服务(比如队列消费者),而非一次性脚本。你的Python代码执行完数据库查询、打印逻辑后,进程正常终止(状态0),但Heroku会将这种"任务完成后退出"的情况判定为crashed——因为它默认期望worker进程持续运行。
解决方案
根据你"启动应用时展示数据库内容"的需求,提供三种针对性方案:
方案1:让进程执行完后保持存活(仅日志查看场景)
如果只是想启动时打印数据,之后让进程维持存活状态,可在代码末尾添加阻塞逻辑,阻止进程退出:
# 在数据库查询打印代码后添加 import time while True: time.sleep(3600) # 每小时休眠一次,保持进程活跃
方案2:改用web dyno,通过HTTP接口暴露内容(对外访问场景)
若需要外部能访问数据库内容,将代码改造为简单web服务(以Flask为例):
- 更新
requirements.txt,添加依赖:
flask>=2.0.0 gunicorn>=20.0.0 psycopg2-binary>=2.9.0 # 其他原有依赖
- 修改代码(示例命名为
app.py):
from flask import Flask import psycopg2 from os import getenv app = Flask(__name__) def get_db_conn(): return psycopg2.connect(getenv('DATABASE_URL')) @app.route('/') def display_data(): conn = get_db_conn() cur = conn.cursor() cur.execute('SELECT * FROM your_table;') # 替换为你的查询语句 data = cur.fetchall() cur.close() conn.close() # 格式化数据为可读格式返回 return '<pre>' + '\n'.join(str(row) for row in data) + '</pre>' if __name__ == '__main__': app.run(host='0.0.0.0', port=int(getenv('PORT', 5000)))
- 修改
Procfile为web dyno启动指令:
web: gunicorn app:app
方案3:一次性执行脚本(无需长期部署场景)
若仅需一次性运行脚本打印数据,无需长期部署dyno,直接用Heroku临时命令:
heroku run python ponts.py
该命令会启动临时dyno执行脚本,完成后自动销毁,不会触发crashed状态。
内容的提问来源于stack exchange,提问作者Thibault Roussel
相关产品推荐
相关产品推荐

