参数化/准备好的陈述用法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?