2014-08-29 73 views
7

我試圖在Postgresql(9.3)中使用Sequelize(1.7)並嘗試使用架構。我在數據庫的外部創建了模式,但在我的模型中使用它們。當我嘗試做模型關聯時,Sequelize抱怨關係不存在。當我重新定義模型以使用PostgreSQL的默認「公共」模式時,它工作正常。使用Sequelize無法在架構(postgresql)中關聯模型

下面是測試情況下,模型定義和代碼

var Promise = require("bluebird"); 
var Sequelize = require("sequelize"); 
var _ = require('lodash-node'); 

var schemaName ="test_schema"; 
var sequelize = new Sequelize(c.database,c.username, 
    c.password,{dialect :'postgres', port:'5432',schema:schemaName}); 

var User =sequelize.define('User',{ 
id:{ type: Sequelize.INTEGER,primaryKey:true, autoIncrement:true}, 
name:{type:Sequelize.TEXT,allowNull:false}, 
nick_name:{type:Sequelize.TEXT,allowNull:true}, 
date_of_joining:{type:Sequelize.DATE,allowNull:false,defaultValue:Sequelize.NOW} 

}, 
{ 
    tableName:"user", 
    underscored:true, 
    timestamps:false 

} 
); 

var Task = sequelize.define('Task', 
{ 
    id:{ type: Sequelize.INTEGER,primaryKey:true, autoIncrement:true}, 
    name:{type:Sequelize.TEXT,allowNull:false}, 
    begin_time:{type:Sequelize.DATE,allowNull:false,defaultValue:Sequelize.NOW}, 
    end_time:{type:Sequelize.DATE,allowNull:true} 
}, 
{ 
    tableName:"task", 
    underscored:true, 
    timestamps:false 

} 

); 

User.schema(schemaName); 
Task.schema(schemaName); 

User.hasMany(Task, {as:"Tasks"}); 

sequelize.sync({force:true}, {logging:console.log}) 
.then(function(args){ 

var users =[ 
    {name:"Abraham Milbard"}, 
    {name:"Jimmy Quake"}, 
    {name:"John Amayo"} 
]; 
var tasks =[ 
    {name:"Bring 100 apples by today evening"}, 
    {name:"Do the dishes"}, 
    {name:"Watch soap and weep"}, 
    {name:"Bitch about your miserable life"} 
]; 

User.create(users[0]) 
    .success(function(usr){ 
     var chainer = new Sequelize.Utils.QueryChainer; 
     var t1 = Task.build(tasks[0 ]), 
      t2 = Task.build(tasks[1]); 
     chainer.add(t1.save()); 
     chainer.add(t2.save()); 
     chainer.runSerially({ skipOnError:true}) 
      .success(function(results){ 
       var tsk1 = results[0]; 
       var tsk2 = results[1]; 
       usr.setTasks([tsk1,tsk2]).success(function(assocTasks){ 

       }); 
      }).error(function(err){ 
       console.log("Could not add tasks to user"+err); 
      }); 

    }).error(function(err){ 
     console.log("Could not create user "); 
    }); 

}); 

如果執行此代碼,報告的錯誤是:

error: relation "task" does not exist 

而產生的疑問是:

Executing (default): SELECT * FROM "test_schema"."task" WHERE "test_schema"."task"."user_id"=1; 
Executing (default): UPDATE "task" SET "user_id"=1 WHERE "id" IN (1,2) RETURNING * 

可以清楚地看到UPDATE語句失敗,因爲模式前綴「test_架構「缺失。換句話說,該工具發出以下查詢:

UPDATE "test_schema"."task" SET "user_id"=1 WHERE "id" IN (1,2) RETURNING * 

它會工作得很好。任何人都可以提供任何解決方法/見解?

回答

2

看起來你正在運行的QueryChainer從一個版本sequelize的,這是我遇到了當我第一次開始嘗試運行示例中刪除sequelize.js

的舊版本。我還發現一個github問題引用了一個類似的問題,並針對該問題進行了合併修復。

小bug修復 - 使用創建的,而不是建立

這裏是更新的代碼:

var Sequelize = require("sequelize"); 
var _ = require('lodash-node'); 

var schemaName ="test_schema"; 

var sequelize = new Sequelize('database', 'username', 'password', {dialect :'postgres', port:'5432',schema:schemaName}); 

var User =sequelize.define('User',{ 
    id:{ type: Sequelize.INTEGER,primaryKey:true, autoIncrement:true}, 
    name:{type:Sequelize.TEXT,allowNull:false}, 
    nick_name:{type:Sequelize.TEXT,allowNull:true}, 
    date_of_joining: {type:Sequelize.DATE,allowNull:false,defaultValue:Sequelize.NOW} 

    }, 
    { 
     tableName:"user", 
     underscored:true, 
     timestamps:false 
    } 
); 

var Task = sequelize.define('Task', 
    { 
     id:{ type: Sequelize.INTEGER,primaryKey:true, autoIncrement:true}, 
     name:{type:Sequelize.TEXT,allowNull:false}, 
     begin_time:{type:Sequelize.DATE,allowNull:false,defaultValue:Sequelize.NOW}, 
     end_time:{type:Sequelize.DATE,allowNull:true} 
    }, 
    { 
     tableName:"task", 
     underscored:true, 
     timestamps:false 
    } 

); 

User.schema(schemaName); 
Task.schema(schemaName); 

User.hasMany(Task, {as:"Tasks"}); 

sequelize.sync({force:true}, {logging:console.log}) 
    .then(function(args){ 

     var users =[ 
      {name:"Abraham Milbard"}, 
      {name:"Jimmy Quake"}, 
      {name:"John Amayo"} 
     ]; 
     var tasks =[ 
      {name:"Bring 100 apples by today evening"}, 
      {name:"Do the dishes"}, 
      {name:"Watch soap and weep"}, 
      {name:"Bitch about your miserable life"} 
     ]; 

     User.create(users[0]) 
      .then(function(usr){ 
      var tsk1; 
      Task.create(tasks[0]) 
       .then(function(task) { 
        tsk1 = task; 
        return Task.create(tasks[1]); 
       }) 
       .then(function(tsk2) { 
        return usr.setTasks([tsk1,tsk2]); 
       }) 
       .then(function (assocTasks) { 
       }) 
       .catch(function(err) { 
        console.log(err); 
       }); 
     }); 
}); 

這裏是輸出:

Executing (default): DROP TABLE IF EXISTS "test_schema"."task" CASCADE; 
Executing (default): DROP TABLE IF EXISTS "test_schema"."user" CASCADE; 
Executing (default): DROP TABLE IF EXISTS "test_schema"."user" CASCADE; 
Executing (default): CREATE TABLE IF NOT EXISTS "test_schema"."user" ("id" SERIAL , "name" TEXT NOT NULL, "nick_name" TEXT, "date_of_joining" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id")); 
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND t.relkind = 'r' and t.relname = 'user' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname; 
Executing (default): DROP TABLE IF EXISTS "test_schema"."task" CASCADE; 
Executing (default): CREATE TABLE IF NOT EXISTS "test_schema"."task" ("id" SERIAL , "name" TEXT NOT NULL, "begin_time" TIMESTAMP WITH TIME ZONE NOT NULL, "end_time" TIMESTAMP WITH TIME ZONE, "user_id" INTEGER REFERENCES "test_schema"."user" ("id") ON DELETE SET NULL ON UPDATE CASCADE, PRIMARY KEY ("id")); 
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) AND t.relkind = 'r' and t.relname = 'task' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname; 
Executing (default): INSERT INTO "test_schema"."user" ("id","name","date_of_joining") VALUES (DEFAULT,'Abraham Milbard','2015-08-15 14:39:46.000 +00:00') RETURNING *; 
Executing (default): SELECT "id", "name", "begin_time", "end_time", "user_id" FROM "test_schema"."task" AS "Task" WHERE "Task"."user_id" = 1; 
Executing (default): UPDATE "test_schema"."task" SET "user_id"=1 WHERE "id" IN (1, 2) 
相關問題