2017-11-16 7 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

ああ、それを持っています。 postgresqlがPRIMARY KEYを追加しています。 – PowerLove

関連する問題