当我执行以下查询时,一切都在psql中完成:
-- psql
INSERT INTO public.contest (contest_id, period_id, start_ts, end_ts, contest_name, default_format, status )
VALUES ('VKVPA', '2019/01', timestamp '2019-01-20 08:00',
timestamp '2019-01-20 11:00', 'description', 'EDI', 'NEW' ) RETURNING contest_key;
-- console output:
contest_key |
------------+
17 |
(qazxsw poi和qazxsw poi有类型qazxsw poi)当我在程序中执行相同操作时,它以语法错误结束:
start_ts
控制台输出:
end_ts
当我尝试逐步执行pg模块中的函数时,我可以看到完全相同的正确值,那么为什么同样的事情会导致javascript中的SQL语法错误,如果SQL本身没问题呢?
不幸的是,我不知道在哪里寻找pg模块创建的最终SQL文本。
更令我困惑的是,昨天同样的计划有效,今天却没有。我没有对程序本身,tsc transpiler或pg模块进行任何更改。
UPDATE
以下代码有效。我没有将时间戳字符串作为参数传递,而是将它们直接包含在查询文本中。显然,这是libpq或javascript模块中的错误。
TIMESTAMP WITHOUT TIME ZONE
显然,这是postgres文档中的一个错误。即使字符串是文字常量,也不能在要分配给列的表达式中使用此语法,但这在手册中未明确提及(相反,它提到其他类型转换表达式也可用于运行时转换)。我建议PostgreSQL手册的作者在这个细节上更加明确一些。解决方案:使用CAST($ 3 AS TIMESTAMP)或postgresql特定语法$ 3 :: timestamp。
// contest-debug.ts
import { Pool } from 'pg' ;
let pool = new Pool( {user: 'contest_owner', database: 'contest'} );
pool.query(
"INSERT INTO public.contest (contest_id, period_id, start_ts, end_ts, contest_name, default_format, status ) "
+ "VALUES ($1, $2, timestamp $3, timestamp $4, $5, $6, 'NEW' ) RETURNING contest_key",
['VKVPA', '2019/02', '2019-01-20 08:00', '2019-01-20 11:00', 'VKV Provozni aktiv 2019/01', 'EDI']
)
.then( result => {
console.log(`New contest has number ${result.rows[0].contest_key}`);
})
.catch( reason => { console.log( 'Contest creation failed:', reason )});