Kir*_*ppa 8 javascript orm node.js sequelize.js
我试图使用Sequelize(1.7)与Postgresql(9.3)并尝试使用模式.我在数据库外部创建了模式,但在我的模型中使用它们.当我试图做模型关联时,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 ");
});
});
Run Code Online (Sandbox Code Playgroud)
如果执行此代码,则报告的错误是:
error: relation "task" does not exist
Run Code Online (Sandbox Code Playgroud)
生成的查询是:
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 *
Run Code Online (Sandbox Code Playgroud)
可以清楚地看到UPDATE语句失败,因为缺少模式前缀"test_schema".换句话说,如果该工具发出以下查询:
UPDATE "test_schema"."task" SET "user_id"=1 WHERE "id" IN (1,2) RETURNING *
Run Code Online (Sandbox Code Playgroud)
它会工作得很好.这里有人可以提供任何解决方法/见解吗?
看起来您正在运行旧版本的sequelize.js
QueryChainer 已从sequelize 的一个版本中删除,这是我第一次开始尝试运行您的示例时遇到的情况。我还发现了一个 github 问题,该问题引用了类似的问题以及该问题的合并修复。
小错误修复 - 使用创建而不是构建
这是更新后的代码:
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 );
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是输出:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3392 次 |
| 最近记录: |