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

在Heroku托管的Laravel项目中配置Proximo静态IP实现Python脚本的MySQL外部数据库连接

解决Heroku + Proximo静态IP下Python脚本连接MySQL的问题

嘿,我来帮你搞定这个配置!你已经安装了Proximo插件,现在只需要调整两个地方就能让Python脚本通过静态IP连接外部数据库,下面分两种方案说明:

方案一:用Proximo命令包装Python调用(最简单)

Proximo插件自带了一个proximo命令,它会自动让后续命令的出站流量走Proximo的静态IP,完全不用修改Python代码,只需要调整Laravel控制器里的调用命令:

修改Laravel控制器代码

// 给python命令加上proximo前缀,自动走静态IP代理
$dataString = shell_exec("proximo python3 storage/app/path/to/python_script.py");
$data = JsonHelper::loadFromString($dataString);

修正Python脚本的小问题

注意你的Python脚本里mycursor.toList()是错误的——mysql.connector的游标没有这个方法,换成fetchall()就行。如果想让输出的JSON带列名(更易读),还可以把结果转成字典列表:

import mysql.connector
import json
import os

# 用绝对路径避免路径问题
path = os.path.dirname(os.path.abspath(__file__))

def getData():
    with open(os.path.join(path, 'query.txt'), 'r') as f:
        queryString = f.read()
    mydb = mysql.connector.connect(
        host="<database host>",
        user="<user>",
        password="<password>",
        database='<database name>'
    )
    mycursor = mydb.cursor()
    mycursor.execute(queryString)
    # 替换toList()为fetchall()获取所有结果
    rows = mycursor.fetchall()
    # 可选:转成带列名的字典,让JSON结构更清晰
    columns = [col[0] for col in mycursor.description]
    result = [dict(zip(columns, row)) for row in rows]
    return result

if __name__ == '__main__':
    result = getData()
    print(json.dumps(result, ensure_ascii=False, indent=4))

这样修改后,proximo命令会自动处理流量代理,让你的Python脚本的数据库连接从Proximo的静态IP发出,只要这个IP在数据库的白名单里,就能正常连接了。

方案二:在Python脚本中手动配置Proximo代理

如果你不想用proximo命令包装,也可以直接在Python脚本里读取Proximo的环境变量,手动配置MySQL连接的代理:

修改Python脚本的连接部分

import mysql.connector
import json
import os

path = os.path.dirname(os.path.abspath(__file__))

def getData():
    # 读取Heroku自动配置的Proximo环境变量
    proximo_host = os.getenv('PROXIMO_HOST', 'proxy.proximo.io')
    proximo_port = int(os.getenv('PROXIMO_PORT', 1080))
    proximo_user = os.getenv('PROXIMO_USERNAME')
    proximo_pass = os.getenv('PROXIMO_PASSWORD')

    with open(os.path.join(path, 'query.txt'), 'r') as f:
        queryString = f.read()
    
    mydb = mysql.connector.connect(
        host="<database host>", # 依然填真实的数据库主机
        user="<user>",
        password="<password>",
        database='<database name>',
        # 配置Proximo代理参数
        proxy={
            'host': proximo_host,
            'port': proximo_port,
            'username': proximo_user,
            'password': proximo_pass
        },
        connection_timeout=30 # 增加超时时间避免连接失败
    )
    mycursor = mydb.cursor()
    mycursor.execute(queryString)
    rows = mycursor.fetchall()
    columns = [col[0] for col in mycursor.description]
    result = [dict(zip(columns, row)) for row in rows]
    return result

if __name__ == '__main__':
    result = getData()
    print(json.dumps(result, ensure_ascii=False, indent=4))

验证环境变量

在Heroku控制台运行heroku config,确认能看到PROXIMO_HOST、PROXIMO_PORT、PROXIMO_USERNAME、PROXIMO_PASSWORD这些变量,如果没有的话,重新安装Proximo插件或者运行heroku addons:create proximo:development(根据你的套餐调整)。

测试步骤

  1. 把修改后的代码推送到Heroku
  2. 在Heroku控制台运行heroku run bash,手动执行proximo python3 storage/app/path/to/python_script.py,检查是否能正常输出JSON结果
  3. 如果遇到连接超时,先确认Proximo的静态IP已经加入数据库的白名单,再核对数据库的主机、用户名、密码是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:44:06