2017-11-16 17 views
1

テーブルレイアウトの例を次に示します。postgresqlでknexを使って複数の行を条件付きで更新するには?

CREATE TABLE test (id1 int, id2 int, auth boolean); 
INSERT INTO test VALUES (1, 1, true); 

私は次のクエリをknex.jsフレームワークに変換しようとしています。ここで

UPDATE test as t 
    SET auth = c.auth 
    from (values (1, 1, false),(2, 1, false)) 
    as c(id1, id2, auth) 
    where c.id1 = t.id1 AND c.id2 = t.id2; 

select * from test 

はフィドルです:私は周りを見回して、次のリソースを見つけたhttp://sqlfiddle.com/#!17/62529/8

github issueupdate multiple queries (no conditional)

をこれらのメソッドを実装しようとした後、私はまだ失敗したアップ来ていますどこが間違っているのかわからない。

私は次のように、knex.rawステートメントに私の元Postgresのクエリをラップすることによって、クエリをブルートフォースしようとしました:

return knex.raw('' + 
    'UPDATE test as t ' + 
    'SET auth = c.auth ' + 
    'from (values (1, 1, false),(2, 1, false))' + 
    'as c(id1, id2, auth)' + 
    'where c.id1 = t.id1 AND c.id2 = t.id2;') 

がどのエラーを思い付くsyntax error on or near « as »

また、私はしましたgithubの問題のアドバイスに従ってみました。

let string = knex 
     .into('test t') 
     .update('auth, c.auth') 
     .values('(1, 1, false), (2, 1, false)') 
     .where(knex.raw('c.id1 = t.id1 AND c.id2 = t.id2')) 
     .toString() 

     knex.raw(string) 

エラー「値」を返すのは関数ではありません。

私はknexとpostgresの両方に新しいので、痛いほど明白な何かが欠けているかどうかはわかりません!どんな助けも大歓迎です。 false))asで「と」のfalse)) asになるために前にスペースを必要とするかもしれないように見える生のバージョンで

答えて

3

...

私は、以下に示すよう.on('query-error',を追加することでこれを見ました。この情報を使用すると、SQLエンジンエラーかKnexエラーか、そして必要に応じてSQLが生成されたかどうかを判断できるはずです。

return knex.raw('' + 
    'UPDATE test as t ' + 
    'SET auth = c.auth ' + 
    'from (values (1, 1, false),(2, 1, false)) ' + 
    'as c(id1, id2, auth)' + 
    'where c.id1 = t.id1 AND c.id2 = t.id2;') 
    .on('query-error', function(ex, obj) { 
     console.log("KNEX query-error ex:", ex, "obj:", obj); 
    }).then(function(retVal) { 
     console.log("Query ran okay."); 
     return retVal; 
    }); 

はまた、あなたの右のそれを得るのを助けるために、クエリに関する情報を与える.on('query',があります。参照してください:http://knexjs.org/#Interfaces-query

よろしく、 ゲーリー。

関連する問題