无法使用Sequelize将Schema(postgresql)中的模型关联起来

我正在尝试使用Postgresql(9.3)的Sequelize(1.7)并尝试使用模式。 我在数据库中创build了外部模式,但在我的模型中使用它们。 当我试图做模型关联时,Sequelize抱怨这个关系不存在。 当我重新定义模型使用PostgreSQL的默认“公共”模式时,它工作正常。

这里是testing用例的模型定义和代码

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 * 

可以清楚地看到,由于模式前缀“test_schema”缺失,UPDATE语句失败。 换句话说,该工具发出以下查询:

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

它会工作得很好。 任何人都可以提供任何解决方法/见解?

看起来你正在运行一个旧版本的sequelize.js

QueryChainer从一个sequelize版本中被删除,这是我第一次尝试运行你的例子时碰到的。 我还发现一个github问题,引用了一个类似的问题,并针对该问题进行了合并修复。

小错误修复 – 使用创build而不是构build

这里是更新的代码:

 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)