Knex: Berechnete Spalte auswählen?

Erstellt am 18. Dez. 2014  ·  3Kommentare  ·  Quelle: knex/knex

Ich versuche, eine Abfrage mit der postgresql-Erddistanz-Erweiterung zu schreiben und möchte eine berechnete Spalte zurückgeben, aber ich erhalte immer eine Fehlermeldung über: fehlender FROM-Klauseleintrag für Tabelle "670906,-79". Dies liegt vermutlich daran, dass der Parser denkt, dass ein Punkt einen Tabellennamen von einem Spaltennamen trennt, aber in meinem Fall führe ich eine Berechnung durch (siehe Beispielabfrage unten). Gibt es eine Möglichkeit, dies zu umgehen?

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

Hilfreichster Kommentar

Sie sollten knex.raw für Ihre berechnete Spalte verwenden, damit sie nicht zitiert wird. Folgendes sollte funktionieren:

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])

Alle 3 Kommentare

Sie sollten knex.raw für Ihre berechnete Spalte verwenden, damit sie nicht zitiert wird. Folgendes sollte funktionieren:

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])

Vielen Dank! Genau das, was ich brauchte. Irgendwie habe ich nicht daran gedacht, knex.raw .

Gern geschehen!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

fsebbah picture fsebbah  ·  3Kommentare

arconus picture arconus  ·  3Kommentare

hyperh picture hyperh  ·  3Kommentare

tjwebb picture tjwebb  ·  3Kommentare

aj0strow picture aj0strow  ·  3Kommentare