1

我正在koa v2使用pg-promise. 我尝试SELECT 2 + 2;在 Parameterized/Prepared Statement 中做一个简单的测试来测试我的设置:

// 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 } ]

我的问题:

我想将结果存储4ctx.state. 我不知道我怎样才能在里面访问它[ anonymous { '?column?': 4 } ]

谢谢您的帮助!

编辑:

我在官方 wiki 中找到了另一种推荐的(1) 方式(2)来处理命名参数。

// 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 对象一样访问数字。难道我做错了什么?还有其他方法可以访问此值吗?

推荐的、更快、更安全的使用方法是什么?

4

1 回答 1

0

由于您只请求一个值,因此您应该使用方法

const {value} = await db.one({
    name: 'addition',
    text: 'SELECT 2 + 2 as value',
}); // value = 4

对于这样的例子,你不能使用PreparedStatementParameterizedQuery类型,因为它们在服务器端格式化查询,而 PostgreSQL 不支持类似$1 + $1.

真正的问题是——你真的需要这些类型吗?

于 2016-12-03T16:11:43.067 回答