2017-11-16 10 views
0

스키마 구축을 위해 knex raw를 사용하고 싶습니다. 주로 내가 한 부씩 인쇄 기능을 내가) (knex.raw에 따옴표로 전체 일을 퍼팅 시도knex 원시 쿼리 스키마 작성기

CREATE TABLE session (
    sid varchar NOT NULL COLLATE "default", 
    sess json NOT NULL, 
    expire timestamp(6) NOT NULL 
) 

WITH (OIDS=FALSE); 

ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE; 

이없는 knex 같은 것 때문에이 세션 테이블을 만드는 데 사용할, 그러나 그것은 나에게 오류를주고 있어요. 이 경우 가장 좋은 전략은 무엇입니까?

답변

2

짧은 대답은 knex.raw 대신 knex.schema.raw을 사용하는 것입니다.

아래의 원시는 나를 위해 일했습니다. SQLite로 테스트하는 동안 SQLite Syntax 오류가 발생하기 때문에 SQL의 축약 된 버전을 만들었습니다. 또한 .on('query-error', ...을 사용하면 SQL 엔진 오류를 반환하는 데 유용합니다.

let rawCreate = 'CREATE TABLE session ('+ 
    'sid varchar NOT NULL, sess json NOT NULL, '+ 
    'expire timestamp(6) NOT NULL);'; 
let rawCreateOriginal = 'CREATE TABLE session ('+ 
    'sid varchar NOT NULL COLLATE "default", sess json NOT NULL, '+ 
    'expire timestamp(6) NOT NULL) WITH (OIDS=FALSE);'; 

let rawAlter = 'ALTER TABLE "session" ADD KEY "sid" NOT DEFERRABLE INITIALLY IMMEDIATE;'; 
let rawAlterOriginal = 'ALTER TABLE "session" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") NOT DEFERRABLE INITIALLY IMMEDIATE;'; 

return knex.schema.hasTable('session') 
    .then(function(exists) { 
     if (!exists) { 
      return knex.schema.raw(rawCreate) 
      .on('query-error', function(ex, obj) { 
       console.log("DA.INIT81 query-error ex:", ex, "obj:", obj); 
      }).then(function() { 
       console.log("DA.INIT01 Created table session."); 
      }).then(function() { 
       return knex.schema.raw(rawAlter) 
      }).then(function() { 
       console.log("DA.INIT02 Altered table session."); 
      }); 
     } 
    }) 
    .catch((ex) => { 
     console.error("DA.INIT88 Create or Alter table session is broken. ex:",ex); 
    }); 

희망이 있습니다. 게리.

+0

감사합니다. 이것은 분명히 나를 도왔다. 이 코드를 실행하려고하면 세션 테이블이 만들어졌지만 "sid"유형이 잘못되었습니다. – PowerLove

+0

Ahnvm, 알겠습니다. postgresql을 잊어 버리면 PRIMARY KEY가 추가됩니다. – PowerLove