Knex查询静态"column"作为别名。

9
我正在尝试使用Postgres在Knex中实现以下查询,以返回一个静态的"$type"列(为了向GraphQL服务器提供类型提示): select *, 'Patrol' as "$type" from patrol; 当我使用Knex查询构建器时,它会搞乱引号。
knex('patrol')
  .select(['*', `'Patrol' as "$type"`])
  .where('id', 12345)
  .first()

返回

ERROR:  column "'Patrol'" does not exist at character 11
STATEMENT:  select *, "'Patrol'" as """$type""" from "patrol" where "id" = $1 limit $2

我可以使用knex.raw()构建查询,但我真的不想这样做:

knex.raw(
  `SELECT *, 'Patrol' as "$type" FROM patrol WHERE id = '${value}' LIMIT 1;`
)

我应该如何构建select()语句,以便查询构建器能够正确解释它?

2个回答

11

我使用 knex.raw()select 中使其起作用:

knex('patrol')
  .select(knex.raw(`*, 'Patrol' as "$type"`)
  .where('id', 12345)
  .first()

8

这个不起作用吗 (https://runkit.com/embed/g5h8qwmeyoyh)?

const Knex = require('knex');

const knex = Knex({
  client: 'pg'
});

knex('patrol')
  .select('*', 'Patrol as $type')
  .where('id', 12345)
  .toSQL()

// select *, "Patrol" as "$type" from "patrol" where "id" = ?

你是想在每一行中添加字符串字面量 Patrol 并使用别名 '$type' 吗?如果是这样,那么可以采用如下的 raw 方式来进行方言转义和引号处理(https://runkit.com/embed/12av9qxxwgyj):

require('sqlite3');
const Knex = require('knex');

const knex = Knex({
  client: 'sqlite',
  connection: ':memory:'
});

await knex.schema.createTable('test', t => {
  t.increments('id').primary();
  t.string('data');
});

await knex('test').insert([{ data: 'foo' }, { data: 'bar' }]);

console.dir(
  await knex('test').select('*', knex.raw('? as ??', ['Patrol', '$type']))
);

是的,将“Patrol”作为字符串文字添加,并使用别名“$type”正是我想要做的。我已经成功地使用了raw实现它。 - grahamb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接