私は、いくつかのJSONデータを格納するPostgresにカラムを持っています。 JSONにはスキーマは定義されていませんが、指定されたキーを持つすべてのレコードを検索することは可能です。Knexjs PgSQL jsonクエリ
私は、クエリを構築するためにKnexJSを使用していますし、これまでのところ、私はこの思い付いた:私は型を指定することが可能になるとは思わないので、
tx.select('*').from('table')
.whereRaw('cast(data->>? as ?) = ?', [key, type, JSON.parse(value)]));
しかし、それは働いていません。それでも
、私はこのようにそれを手動で指定してみてください:
tx.select('*').from('table')
.whereRaw('cast(data->>? as boolean) = ?', [key, JSON.parse(value)]));
それはまだ動作しません! DEBUG:knex:*
{ key: 'admin', value: 'true', type: 'boolean' }
knex:tx trx1: Starting top level transaction +0ms
knex:pool INFO pool postgresql:pg:client0 - dispense() clients=1 available=0 +2ms
knex:client acquired connection from pool: __knexUid2 +38ms
knex:query BEGIN; +2ms
knex:bindings undefined +1ms
knex:query select * from "contexts" where cast(data->>? as boolean) = ? +18ms
knex:bindings [ 'admin', true ] +0ms
knex:query COMMIT; +9ms
knex:bindings undefined +0ms
knex:tx trx1: releasing connection +6ms
knex:client releasing connection to pool: __knexUid2 +1ms
knex:pool INFO pool postgresql:pg:client0 - dispense() clients=0 available=1 +1ms
私はこれを実現する方法上の任意のアイデアを使用したとき、これは、コンソールからのログですか?
ありがとうございます!
申し訳ありませんが、私は実際に私の質問でタイプを作った。私は3つのバインディングを使用するので、2番目の例は失敗しません。実際には2つだけ使用します。ログでは、 'knex:bindings ['admin'、true] + 0ms'を見ることができます。/ そして、最初の例の実際の出力が何であるかを理解しています。これを回避する方法があるのかどうか、そして2番目の例でも失敗するのはなぜかと尋ねています。 – tiansivive
私が提供したSQLのヒント例の1つを試すことができます。また、2番目(手動キャスティング)では 'value = 'を' ... =?:: boolean'としてキャストしようとすることもできます。最初のものについては、 '?'の代わりに '?'バインドを試みるかもしれません。 –