sequelize 给出了错误的表名
Posted
技术标签:
【中文标题】sequelize 给出了错误的表名【英文标题】:sequelize gives the wrong table name 【发布时间】:2015-04-17 06:09:11 【问题描述】:我有一个数据库。我有一个“user
”表
我正在尝试使用sequelize
创建我的第一个REST
api
但是,当它执行我的查询时,我在控制台中得到以下信息:
SELECT `id`, `username`, `password`, `name`, `organization_id`, `type_id`, `join_date` FROM `users` AS `user` WHERE `user`.`id` = '1';
如您所见,它尝试使用名为 users
的表,但该表不存在。
这是我的一些代码:
如果您需要更多,请告诉我,我不确定哪里出了问题? :S
var User = sequelize.define('user',
id: DataTypes.INTEGER,
username: DataTypes.STRING,
password: DataTypes.STRING,
name: DataTypes.STRING,
organization_id: DataTypes.INTEGER,
type_id: DataTypes.INTEGER,
join_date: DataTypes.STRING
,
instanceMethods:
retrieveAll: function(onSuccess, onError)
User.findAll(, raw: true)
.ok(onSuccess).error(onError);
,
retrieveById: function(user_id, onSuccess, onError)
User.find(where: id: user_id, raw: true)
.success(onSuccess).error(onError);
,
add: function(onSuccess, onError)
var username = this.username;
var password = this.password;
var shasum = crypto.createHash('sha1');
shasum.update(password);
password = shasum.digest('hex');
User.build( username: username, password: password )
.save().ok(onSuccess).error(onError);
,
updateById: function(user_id, onSuccess, onError)
var id = user_id;
var username = this.username;
var password = this.password;
var shasum = crypto.createHash('sha1');
shasum.update(password);
password = shasum.digest('hex');
User.update( username: username,password: password,where: id: id )
.success(onSuccess).error(onError);
,
removeById: function(user_id, onSuccess, onError)
User.destroy(where: id: user_id).success(onSuccess).error(onError);
);
【问题讨论】:
为了清楚起见,“用户”表实际上是否已经存在于您的数据库中?你是手动创建的还是 Sequelize 创建的? @HeadCode 用户表存在于我的数据库中并且是手动创建的并且已经包含大量数据 我没有意识到这一点,但“用户”看起来是一个保留关键字。我不能说这会给您带来问题,但请查看这篇文章:***.com/questions/21114499/… 【参考方案1】:要解决您的问题,您需要在选项对象中设置 freezeTableName = true。
例如
var User = sequelize.define('user',
id: DataTypes.INTEGER,
username: DataTypes.STRING,
password: DataTypes.STRING,
name: DataTypes.STRING,
organization_id: DataTypes.INTEGER,
type_id: DataTypes.INTEGER,
join_date: DataTypes.STRING
,
freezeTableName: true,
instanceMethods:
retrieveAll: function(onSuccess, onError)
User.findAll(, raw: true)
.ok(onSuccess).error(onError);
,
retrieveById: function(user_id, onSuccess, onError)
User.find(where: id: user_id, raw: true)
.success(onSuccess).error(onError);
,
add: function(onSuccess, onError)
var username = this.username;
var password = this.password;
var shasum = crypto.createHash('sha1');
shasum.update(password);
password = shasum.digest('hex');
User.build( username: username, password: password )
.save().ok(onSuccess).error(onError);
,
updateById: function(user_id, onSuccess, onError)
var id = user_id;
var username = this.username;
var password = this.password;
var shasum = crypto.createHash('sha1');
shasum.update(password);
password = shasum.digest('hex');
User.update( username: username,password: password,where: id: id )
.success(onSuccess).error(onError);
,
removeById: function(user_id, onSuccess, onError)
User.destroy(where: id: user_id).success(onSuccess).error(onError);
);
【讨论】:
哇,我已经非常接近解决这个问题了,我只是将那行插入错误的位置,谢谢! 感谢您为我们指明了正确的方向,但上面的实际语法不正确:freezeTableName = true
应该是 freezeTableName: true
【参考方案2】:
我之前没有使用过 sequelize,但是从他们的文档中阅读 - 可能你错过了 -
User.sync(force: true).then(function ()
// Table created
return User.create(
firstName: 'John',
lastName: 'Hancock'
);
);
即表创建部分...
谢谢
【讨论】:
不使用“user”表,而是创建了一个名为“users”的表以上是关于sequelize 给出了错误的表名的主要内容,如果未能解决你的问题,请参考以下文章
更新 Sequelize 模型时,失败并返回与我提供的不同的表名?
Sequelize包括范围为1的对象:m constraint = false