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

PHP调用Python执行Athena查询,如何转义SQL中的单引号?

问题:PHP调用Python查询Athena时,SQL语句单引号转义无效

我通过PHP调用Python脚本查询Athena,以下是能正常运行的代码:

正常运行的PHP代码

<?php
$sql2Py = "'SELECT address,order,status from myDB.order;'";
$output = shell_exec("python3 pythonScript.py $sql2Py");
echo "my result-" . $output;
?>

对应的Python脚本(pythonScript.py)

#!/usr/bin/env python
import os
import sys
from pyathena import connect
import pandas

# 注:原代码缺少连接实例定义,需补充Athena连接配置(示例如下)
conn = connect(
    s3_staging_dir='s3://你的临时存储桶路径/',
    region_name='你的AWS区域'
)

sql = str(sys.argv[1])
orders = pandas.read_sql(sql,conn) 
print(orders)

当我给SQL语句添加带单引号的条件时,尝试用反斜杠转义单引号(如下代码)但无效:

$sql2Py = "'SELECT address,order,status from myDB.order where status <> \'Completed\';'";

解决方案

方法一:shell单引号环境下用双单引号转义

在PHP的双引号字符串里,SQL中的单引号需要写成两个连续的单引号——因为shell的单引号环境中,两个单引号会被解析为一个单引号:

$sql2Py = "'SELECT address,order,status from myDB.order where status <> ''Completed'';'";

这样传递到Python脚本的SQL语句会自动变为status <> 'Completed',符合语法要求。

方法二:用escapeshellarg安全处理(推荐)

直接使用PHP的escapeshellarg()函数处理SQL字符串,它会自动完成shell层面的引号包裹和特殊字符转义,既避免手动转义的麻烦,又能防止shell注入风险:

<?php
// 直接编写符合语法的SQL语句
$sql = "SELECT address,order,status from myDB.order where status <> 'Completed';";
// 自动处理shell层面的引号和转义
$sql2Py = escapeshellarg($sql);
$output = shell_exec("python3 pythonScript.py $sql2Py");
echo "my result-" . $output;
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:21:32