2014-08-29 5 views
7

zugeordnet werden. Ich versuche Sequelize (1.7) mit Postgresql (9.3) zu verwenden und versuche, Schemas zu verwenden. Ich habe Schemas extern in der Datenbank erstellt, aber in meinen Modellen verwendet. Wenn ich versuche, Modellverbände zu machen, beklagt Sequelize, dass die Beziehung nicht existiert. Wenn ich die Modelle neu definiere, um das Standard "öffentliche" Schema von PostgreSQL zu verwenden, funktioniert es gut.Modelle können nicht in einem Schema (PostgreSQL) mit Sequelize

Hier sind die Modelldefinitionen und Code für den Testfall

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 "); 
    }); 

}); 

Wenn Sie diesen Code ausführen, der Fehler gemeldet wird:

error: relation "task" does not exist 

Und die generierten Abfragen sind:

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 * 

Es ist deutlich zu sehen, dass die UPDATE-Anweisung fehlschlägt, weil das Schema-Präfix "test_ Schema "fehlt. Mit anderen Worten, wenn das Werkzeug die folgende Abfrage ausgegeben hätte:

Es hätte gut funktioniert. Kann jemand hier irgendwelche Workarounds/Einblicke zur Verfügung stellen?

Antwort

2

Sieht aus wie Sie eine ältere Version von sequelize.js

Die QueryChainer von einer Version von sequelize entfernt laufen lassen, das ist, was ich lief in, als ich begann zuerst versuchen, Ihr Beispiel zu laufen. Außerdem habe ich ein Github-Problem gefunden, das auf ein ähnliches Problem und eine kombinierte Fehlerbehebung für dieses Problem verweist.

Minor Bug Fix - mit Build statt erstellen

Hier wird der aktualisierte Code:

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); 
       }); 
     }); 
}); 

und hier ist die Ausgabe:

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)