在typescript / javascript中调用的查询在“timestamp $ 3”返回语法错误,PSQL中的相同查询运行没有问题

问题描述 投票:0回答:1

当我执行以下查询时,一切都在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
postgresql node-postgres
1个回答
0
投票

显然,这是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 )});

© www.soinside.com 2019 - 2024. All rights reserved.