2016-10-22 11 views
1

欠落しているオブジェクトフィールドに対して、defaultオプションのSQLクエリをフォーマットする必要があります。pgp.as.format()の 'default'オプション

let formattedQuery = pgp.as.format('INSERT INTO some_table (a,b,c) VALUES ($(a), $(b), $(c))', object, {default: null}); 
db.none(formattedQuery); 

それは、クエリを事前にフォーマットせずに、直接defaultオプションを渡すことができます:私はpgp.as.formatする外部コールでそれを行うことができますか?基本的に、私はこのような何かをしたいと思います:

db.none('INSERT INTO some_table (a,b,c) VALUES ($(a), $(b), $(c))', object, {default: null}) 

答えて

2

私はpg-promiseの著者です。 pg-promise


すべてのクエリメソッドは、クエリテンプレートは、プロパティを参照する場合、プロパティが存在している必要があり、そうでない場合、エラーがスローされる。すなわち、信頼性向上のため、デフォルトのクエリの書式に依存しています。このようにしておくことは理にかなっています。これは、値で置き換えられていないプロパティを持つクエリが正しく実行できないためです。

内部的には、クエリエンジンは、as.formatの方法(partialおよびdefaultなど)を使用して、高度なクエリの書式設定オプションをサポートしています。ライブラリには、これらのオプションを使用するオブジェクトがいくつかあります。

特に挿入を生成するために使用する必要があるものは、helpers.insertです。これは、単一挿入クエリと複数挿入クエリの両方を生成できます。その方法は、さらに有用なものであるhelpers.updateと共にタイプを使用します。これは構成可能性が高く、不足しているプロパティ(デフォルト値)のデフォルト値をColumnでサポートしています。

ColumnSetを使用すると、選択列またはすべての列にデフォルト値を指定できます。

var pgp = require('pg-promise')({ 
    capSQL: true // to capitalize all generated SQL 
}); 

// declaring a reusable ColumnSet object: 
var csInsert = new pgp.helpers.ColumnSet(['a', 'b', 
    { 
     name: 'c', 
     def: null 
    } 
], {table: 'some_table'}); 

var data = {a:1, b:'text'}; 

// generating our insert query: 
var insert = pgp.helpers.insert(data, csInsert); 
//=> INSERT INTO "some_table"("a","b","c") VALUES(1,'text',null) 

これは自動的にマルチINSERTクエリを生成することが可能になる:

var data = [{a:1, b:'text'}, {a:2, b:'hello'}]; 

// generating a multi-insert query: 
var insert = pgp.helpers.insert(data, csInsert); 
//=> INSERT INTO "some_table"("a","b","c") VALUES(1,'text',null),(2,'hello',null) 
例えば

、のc我々はnullにそれを設定したい場合には、欠落している可能性があり、その列を想定してみましょう

同じアプローチは、単一更新クエリと複数更新クエリに対してうまく機能します。あなたの元の質問に全てにおいて

、:

それは、クエリを、フォーマットする前せずに直接、デフォルトのオプションを渡すことは可能ですか?

いいえ、どちらでもない必要があります。代わりに、適切なクエリを生成するために、helpers名前空間内の前述のメソッドを使用する必要があります。よりパワフルでフレキシブルです)

+0

このような詳細な回答ありがとうございます! – pheasant