2017-11-03 11 views
1

私はColumnSethelper.insert関数を複数行の挿入に使用しています。pg-promise ColumnSetはdefプロパティ付きのPostgres関数を使用します

Postgres Date/Time now()機能を使用するテーブルの列があります。

const cs = new helpers.ColumnSet([ 
    'lastname', 
    { 
     name: 'rental_date', 
     def: 'now()' 
    } 
], { table: { table: 'book_rental', schema: 'public' } }) 

let rentals = [ 
    { 
     lastname: 'Mueller' 
    }, 
    { 
     lastname: 'Johnson' 
    } 
] 

let insert = helpers.insert(rentals, cs) 

db.result(insert) 
    .then(data => res.json({ message: 'Ok!' })) 
    .catch(err => res.json({ message: 'Not ok!' })) 

それはdef: 'now()'を使用して動作しているようだが、私はそれを正しい方法を使用していますことを確認します。

編集:コメントに答えについて

。手動で挿入しようとしましたが、Postgresが'now()'文字列をnow()関数に変換しているようです。

INSERT INTO book_rental (lastname, rental_date) VALUES ('Mueller', 'now()'); 

これは正しいコードであるはずですか?

const cs = new helpers.ColumnSet([ 
    'lastname', 
    { 
     name: 'rental_date', 
     mod: ':raw', 
     def: 'now()' 
    } 
], { table: { table: 'book_rental', schema: 'public' } }) 
+0

'あると思われますあなたはより具体的になることができますか?エスケープされたテキスト文字列ではなく、生のテキスト文字列を使用する必要があるため、うまくいかないようです。 –

+0

申し訳ありませんが、上記のコードを使用し、挿入後にデータベースをチェックすると、 'rental_date'は' timestamptz'として正しく保存されています。それが私がそれが働いていると思った理由です。 – abergavenny

+0

'def'はプロパティが存在しない場合にのみ使用されます。欠落していない場合は、列の値が代わりに使用されるため、機能していない可能性があります。確かめたいならば、代わりに 'init'を使うべきです。 –

答えて

1

あなたのコードは次のような理由から、右見ていない:

  • あなたは無条件now()を使用したいが、プロパティが存在しないときdef値のみが使用されていますソースオブジェクト(Column参照)。 initコールバックは、適切な値のオーバーライドを保証するために代わりに使用する必要があります。
  • now()をエスケープ文字列として返します。クエリでは、生のテキスト文字列としてクエリが必要です。

まずは、Custom Type Formattingあたりとして、再利用可能なRaw Text文字列を宣言してみましょう:

const rawText = text => ({toPostgres:() => text, rawType: true}); 

その後、あなたは、このような列を定義することができます

{ 
    name: 'rental_date', 
    init:() => rawText('now()') 
} 

をそして、あなたは、最新のを使用していることを確認してくださいバージョンpg-promise(この執筆時点ではv7.2.1)。

または代わりに、あなたはこのようにそれを宣言することができます。しかし、ライブラリのすべてのバージョンで動作します、そしておそらく使用するにも簡単です

{ 
    name: 'rental_date', 
    mod: ':raw', // same as mode: '^' 
    init:() => 'now()' 
} 

この構文;)

+1

私はちょうど感謝のためのコメントを使用すべきではない知っている。しかし、私はそれを言う必要があります**ありがとう!** :) – abergavenny

関連する問題