参数化/准备好的陈述用法pg-promise

我使用pg-promise koa v2 。 我尝试做一个简单的SELECT 2 + 2; 在参数化/准备声明中testing我的设置:

 // http://127.0.0.1:3000/sql/2 router.get('/sql/:id', async (ctx) => { await db.any({ name: 'addition', text: 'SELECT 2 + 2;', }) .then((data) => { console.log('DATA:', data); ctx.state = { title: data }; // => I want to return num 4 instead of [Object Object] }) .catch((error) => { console.log('ERROR:', error); ctx.body = '::DATABASE CONNECTION ERROR::'; }) .finally(pgp.end); await ctx.render('index'); }); 

在模板中渲染[Object Object]并将其从pg-monitor返回给控制台:

 17:30:54 connect(postgres@postgres) 17:30:54 name="addition", text="SELECT 2 + 2;" 17:30:54 disconnect(postgres@postgres) DATA: [ anonymous { '?column?': 4 } ] 

我的问题:

我想将结果4存储在ctx.state 。 我不知道如何在[ anonymous { '?column?': 4 } ]访问它?

感谢您的帮助!

编辑:

我发现另一个推荐的(1) 方法(2)来处理官方wiki中的命名参数。

 // http://127.0.0.1:3000/sql/2 router.get('/sql/:id', async (ctx) => { const obj = { id: parseInt(ctx.params.id, 10), }; await db.result('SELECT ${id} + ${id}', obj) .then((data) => { console.log('DATA:', data.rows[0]['?column?']); ctx.state = { title: data.rows[0]['?column?'] }; // => 4 }) .catch((error) => { console.log('ERROR:', error); ctx.body = '::DATABASE CONNECTION ERROR::'; }) .finally(pgp.end); await ctx.render('index'); }); 

我改变了any对象的result ,返回原始文本。 比我访问4像一个JavaScript对象。 难道我做错了什么? 有另一种方法来访问这个值吗?

什么是build议,更快,更安全的使用方式?

由于您只需要一个值,因此您应该使用方法一 :

 db.one({ name: 'addition', text: 'SELECT 2 + 2 as value', }, [], v => +v.value) .then(value => { console.log('value:', value); //=> value: 4 }); 

首先,我们将结果命名为value ,然后使用可选值转换进行转换: v => +v.value

对于这样的例子,你不能使用PreparedStatement或ParameterizedQuerytypes,因为它们在服务器端格式化查询,PostgreSQL不支持$1 + $1这样的语法。

真正的问题是 – 你真的需要这些types?