我正在使用puppeteer从网页中提取SQL查询。将解析的查询传递到node-postgres客户端查询方法时,总是会收到错误syntax error at or near "."
。
当我console.log查询,并将硬代码输入到client.query()时,它运行良好。我一辈子都无法弄清楚为什么只有硬编码的查询才起作用。
我尝试使用pg-escape,使用美元引号字符串传递查询,剥离空格和换行符。
在这种情况下,是:
puppeteer gets sql from webpage => parse and pass to node-postgres => get an error
puppeteer gets sql from webpage => parse and pass to console.log => manually copy and paste the query into a var => run the query with node-postgres => query success
这是我在console.log记录从网页中提取的文本时得到的查询(这是在我清理完之后):
SELECT
cp.name AS category_page,
cp.id AS category_page_id,
cp.url AS category_page_url,
ARRAY_AGG( DISTINCT g.name) AS projects,
cp.created_by,
date_trunc('day', (cp.created_date)::timestamp)::date AS created_date,
cp.modified_by,
date_trunc('day', (cp.modified_date)::timestamp)::date AS modified_date,
cp.qa_by,
date_trunc('day', (cp.qa_date)::timestamp)::date AS qa_date,
cp.is_terminated,
cp.annotation
FROM ulta.category_page cp
LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group c
LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS g
ON g.category_page_id = cp.id
WHERE (g.ref_resource_group_id='109')
AND (cp.id='4')
GROUP BY cp.id
ORDER BY cp.name
limit 5000
我正在跑步:
console.log(query)
try {
const results = await postgres.query(query);
console.log(results);
} catch(err) {
console.error(err);
}
当我将其扔到调试器中并在查询中中断时,我发现的唯一区别是\n
(未剥离)。否则,它看起来完全一样。
任何帮助将不胜感激!我假设它与console.log打印字符串和node-postgres处理字符串的方式有关。
EDIT
根据注释添加JSON.stringify的console.log结果:
" SELECT\n cp.name AS category_page,\n cp.id AS category_page_id,\n cp.url AS category_page_url, \n ARRAY_AGG( DISTINCT g.name) AS projects,\n cp.created_by, \n date_trunc('day', (cp.created_date)::timestamp)::date AS created_date,\n cp.modified_by, \n date_trunc('day', (cp.modified_date)::timestamp)::date AS modified_date,\n cp.qa_by, \n date_trunc('day', (cp.qa_date)::timestamp)::date AS qa_date, \n cp.is_terminated,\n cp.annotation\n FROM ulta.category_page cp\n LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group c\n LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS g\n ON g.category_page_id = cp.id\n WHERE (g.ref_resource_group_id='109')\n AND (cp.id='4')\n GROUP BY cp.id\n ORDER BY cp.name\n limit 5000\n"
编辑2 用JSON.stringify解析sql查询后,我找到了罪魁祸首。我加了:
const parsedQuery = JSON.stringify(query)
.replace(/\\n/g, '')
.replace(/"/g, '')
.replace(/\s{4,5}/g, ' ')
.trim()
解决了这个问题。我仍然不确定为什么需要这样做。