#node.js #postgresql #node-postgres
#node.js #postgresql #node-postgres
Вопрос:
Я извлекаю SQL-запрос с веб-страницы с помощью puppeteer. Когда я передаю обработанный запрос в метод запроса клиента node-postgres, я всегда получаю ошибку syntax error at or near "."
.
Когда я консоль.войдите в запрос и введите жесткий код в клиент.запрос (), он работает нормально. Я ни за что на свете не могу понять, почему работает только жестко запрограммированный запрос.
Я пытался использовать 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
Это запрос, который я получаю при консоли.запишите извлеченный текст с веб-страницы (это после того, как я его очищу):
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 обрабатывает строки.
Редактировать
Добавление консоли.регистрируйте результаты JSON.stringify в комментарии:
" SELECTn 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.annotationn FROM ulta.category_page cpn LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group cn LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS gn ON g.category_page_id = cp.idn WHERE (g.ref_resource_group_id='109')n AND (cp.id='4')n GROUP BY cp.idn ORDER BY cp.namen limit 5000n"
РЕДАКТИРОВАТЬ 2
После анализа sql-запроса с помощью JSON.stringify я смог найти виновных. Я добавил:
const parsedQuery = JSON.stringify(query)
.replace(/\n/g, '')
.replace(/"/g, '')
.replace(/s{4,5}/g, ' ')
.trim()
Что решило проблему. Я все еще не уверен, зачем это нужно.
Комментарии:
1. Не могли бы вы включить необработанный результат
console.log(JSON.stringify(query))
прямо передpostgres.query
строкой?2. @sachav Я обновил свой пост с помощью консоли. журнал JSON.stringify
3. Вы можете безопасно стерилизовать и подготовить свой SQL с помощью pg-minify 😉