PHP调用Google BigQuery报无效表名、无法识别DELETE错误
问题原因与修复方案
你的代码存在3处核心错误,对应两个报错按以下方式修复即可:
1. Invalid table name 报错根因
- 数据集ID拼写错误:代码中硬编码的
$google_dataset_id = 'photo_proecssing'字母顺序写反,正确拼写为photo_processing,和你控制台里的数据集名称、报错信息中打印的名称差了c和e的顺序,拼接出的表名自然不存在。 - 配置数组语法错误:
$google_client_config数组中'projectId' => <my_project_id>行尾缺少逗号分隔符,PHP解析数组时会出现配置错乱,导致项目ID等参数读取异常。 - 冗余重复配置:初始化
Google_Client时已经传入了keyFilePath参数,后续又重复调用setAuthConfig()传入密钥路径,多余的配置可能引发参数加载冲突,直接删除重复调用即可。
2. Unrecognized token DELETE 报错根因
你使用的BigQuery PHP客户端默认启用Legacy SQL(遗留SQL)方言,该方言本身不支持DELETE、UPDATE、INSERT这类DML操作语法,自然无法识别DELETE关键字。同时执行DML语句需要显式指定使用标准SQL模式,否则即使表名正确也无法正常执行。
修复后可直接运行的代码
// 替换为你的真实项目ID $google_project_id = 'trans-radius-764'; // 修正数据集ID拼写 $google_dataset_id = 'photo_processing'; $google_table_id = 'stats'; $table_name = "{$google_project_id}.{$google_dataset_id}.{$google_table_id}"; // SELECT测试语句 // $sql = "SELECT * FROM `$table_name` LIMIT 1000"; // DELETE业务语句,注意修正时间格式的分隔符 $sql = "DELETE FROM `$table_name` WHERE created_date < '2022-05-25 15:15:07'"; // 补全数组语法,添加缺失的逗号 $google_client_config = [ 'projectId' => $google_project_id, 'keyFilePath' => '/path/to/your/service-account-key.json' // 替换为你的密钥文件真实路径 ]; $google_client = new Google_Client( $google_client_config ); $google_big_query_service = new Google_Service_Bigquery($google_client); // 仅保留权限范围配置,删除重复的认证配置调用 $google_client->setScopes( [ 'https://www.googleapis.com/auth/bigquery' ] ); $jobs = $google_big_query_service->jobs; $query = new Google_Service_Bigquery_QueryRequest(); $query->setQuery( $sql ); // 关键配置:关闭遗留SQL,使用标准SQL方言,解决DML语句识别问题 $query->setUseLegacySql(false); $response = $jobs->query($google_project_id, $query);
额外注意
你原本写的DELETE语句中时间值'2022-05-25 15-15-07'格式有误,时分秒的分隔符应为冒号而非横杠,否则即使SQL语法校验通过,也会触发时间类型解析错误,上述代码中已经修正该问题。
内容的提问来源于stack exchange,提问作者Andy Wallace
相关产品推荐
相关产品推荐

