You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例):

  1. 更新requirements.txt,添加依赖:
flask>=2.0.0
gunicorn>=20.0.0
psycopg2-binary>=2.9.0
# 其他原有依赖
  1. 修改代码(示例命名为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)))
  1. 修改Procfile为web dyno启动指令:
web: gunicorn app:app

方案3:一次性执行脚本(无需长期部署场景)

若仅需一次性运行脚本打印数据,无需长期部署dyno,直接用Heroku临时命令:

heroku run python ponts.py

该命令会启动临时dyno执行脚本,完成后自动销毁,不会触发crashed状态。

内容的提问来源于stack exchange,提问作者Thibault Roussel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:25:07