Sto tentando di utilizzare Sequelize (1.7) con Postgresql (9.3) e provare a utilizzare gli schemi. Ho creato degli schemi esternamente nel database ma li uso nei miei modelli. Quando sto cercando di fare associazioni di modelli, Sequelize si lamenta che la relazione non esiste. Quando ridefinisco i modelli per utilizzare lo schema "pubblico" predefinito di PostgreSQL, funziona perfettamente.Impossibile associare i modelli in uno schema (postgresql) utilizzando Sequelize
Qui ci sono le definizioni del modello e il codice per il test case
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 ");
});
});
Se si esegue questo codice, l'errore segnalato è:
error: relation "task" does not exist
E le query generate sono:
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 *
Si può chiaramente vedere che l'istruzione UPDATE fallisce perché il prefisso dello schema "test_ schema "mancante. In altre parole, lo strumento ha emesso la seguente query:
UPDATE "test_schema"."task" SET "user_id"=1 WHERE "id" IN (1,2) RETURNING *
Avrebbe funzionato bene. Qualcuno qui può fornire soluzioni alternative?