Knex: Selecionar coluna calculada?

Criado em 18 dez. 2014  ·  3Comentários  ·  Fonte: knex/knex

Estou tentando escrever uma consulta usando a extensão postgresql earthdistance e quero retornar uma coluna calculada, mas continuo recebendo um erro sobre: ​​entrada da cláusula FROM ausente para a tabela "670906, -79". Presumivelmente, isso ocorre porque o analisador pensa que um ponto separa um nome de tabela de um nome de coluna, mas, no meu caso, estou executando um cálculo (consulte a consulta de exemplo abaixo). Existe uma maneira de contornar isso?

Possibly unhandled error: missing FROM-clause entry for table "670906,-79"
    at Connection.parseE (/usr/local/lib/node_modules/pg/lib/connection.js:534:11)
    at Connection.parseMessage (/usr/local/lib/node_modules/pg/lib/connection.js:361:17)
    at Socket.<anonymous> (/usr/local/lib/node_modules/pg/lib/connection.js:105:22)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:764:14)
    at Socket.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:426:10)
    at emitReadable (_stream_readable.js:422:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
  var columns = [
    'id',
    '(earth_distance(ll_to_earth(lat, lng), ll_to_earth(43.670906, -79.393331)) as distance)'
  ];
  var result = knex
    .select(columns)
    .from('stores')
    .whereRaw('earth_box(ll_to_earth(43.670906, -79.393331), ?) @> ll_to_earth(lat, lng)', [radiusInStatuteMiles])
question

Comentários muito úteis

Você deve usar knex.raw para a coluna calculada, para que não seja cotada. O seguinte deve funcionar:

var columns = [
  'id',
  knex.raw('earth_distance(ll_to_earth(lat, lng), ll_to_earth(43.670906, -79.393331)) as distance')
];
var result = knex
.select(columns)
.from('stores')
.whereRaw('earth_box(ll_to_earth(43.670906, -79.393331), ?) @> ll_to_earth(lat, lng)', [radiusInStatuteMiles])

Todos 3 comentários

Você deve usar knex.raw para a coluna calculada, para que não seja cotada. O seguinte deve funcionar:

var columns = [
  'id',
  knex.raw('earth_distance(ll_to_earth(lat, lng), ll_to_earth(43.670906, -79.393331)) as distance')
];
var result = knex
.select(columns)
.from('stores')
.whereRaw('earth_box(ll_to_earth(43.670906, -79.393331), ?) @> ll_to_earth(lat, lng)', [radiusInStatuteMiles])

Obrigado! Exatamente o que eu precisava. De alguma forma, não pensei em usar knex.raw .

De nada!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

zettam picture zettam  ·  3Comentários

fsebbah picture fsebbah  ·  3Comentários

nklhrstv picture nklhrstv  ·  3Comentários

olaferlandsen picture olaferlandsen  ·  3Comentários

saurabhghewari picture saurabhghewari  ·  3Comentários