2017-11-03 13 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()을 이스케이프 된 문자열로 반환하고 쿼리에이를 원시 문자열로 사용해야합니다.

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

    그런 다음이 같은 열을 정의 할 수 있습니다 :

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

    을 그리고 당신은 최신을 사용하고 있는지 확인

먼저, Custom Type Formatting에 따라, 재사용 Raw Text 문자열을 선언하자 버전 pg-promise (이 문서 작성 시점에서 v7.2.1).

또는 양자 택일로, 당신은 다음과 같이 선언 할 수 있습니다

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

이 구문은 그러나 라이브러리의 모든 버전에서 작동합니다, 아마 사용하기에도 간단하다)

+1

나는 단지 '감사'에 대한 코멘트를 사용하지 말아야한다는 것을 알고있다. 그러나 나는 그것을 말해야한다 ** 고맙습니다! ** :) – abergavenny