Dav*_*kys 83 node.js sequelize.js
我在'字段列表'中收到一个未知列'userDetails.createdAt'当尝试使用关联获取时.
使用findAll无关联工作正常.
我的代码如下:
var userDetails = sequelize.define('userDetails', {
userId :Sequelize.INTEGER,
firstName : Sequelize.STRING,
lastName : Sequelize.STRING,
birthday : Sequelize.DATE
});
var user = sequelize.define('user', {
email: Sequelize.STRING,
password: Sequelize.STRING
});
user.hasOne(userDetails, {foreignKey: 'userId'});
user.findAll({include: [userDetails] }).success(function(user) {
console.log(user)
});
Run Code Online (Sandbox Code Playgroud)
Jan*_*ier 174
我认为错误是你在sequelize中启用了时间戳,但是你在DB中的实际表定义不包含时间戳列.
当你执行user.find它就会这样做SELECT user.*,只需要你实际拥有的列.但是当您加入时,连接表的每一列都会有别名,这会创建以下查询:
SELECT `users`.*, `userDetails`.`userId` AS `userDetails.userId`,`userDetails`.`firstName` AS `userDetails.firstName`,`userDetails`.`lastName` AS `userDetails.lastName`, `userDetails`.`birthday` AS `userDetails.birthday`, `userDetails`.`id` AS `userDetails.id`, `userDetails`.`createdAt` AS `userDetails.createdAt`, `userDetails`.`updatedAt` AS `userDetails.updatedAt` FROM `users` LEFT OUTER JOIN `userDetails` AS `userDetails` ON `users`.`id` = `userDetails`.`userId`;
Run Code Online (Sandbox Code Playgroud)
修复方法是禁用userDetails模型的时间戳:
var userDetails = sequelize.define('userDetails', {
userId :Sequelize.INTEGER,
firstName : Sequelize.STRING,
lastName : Sequelize.STRING,
birthday : Sequelize.DATE
}, {
timestamps: false
});
Run Code Online (Sandbox Code Playgroud)
或适用于所有型号:
var sequelize = new Sequelize('sequelize_test', 'root', null, {
host: "127.0.0.1",
dialect: 'mysql',
define: {
timestamps: false
}
});
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的错误,两个解决方案\xef\xbc\x9a
\n\nCREATE TABLE `users` (\n `id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'primary key\',\n `name` varchar(30) DEFAULT NULL COMMENT \'user name\',\n `created_at` datetime DEFAULT NULL COMMENT \'created time\',\n `updated_at` datetime DEFAULT NULL COMMENT \'updated time\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'user\';\nRun Code Online (Sandbox Code Playgroud)\n\nconst Project = sequelize.define(\'project\', {\n title: Sequelize.STRING,\n description: Sequelize.TEXT\n },{\n timestamps: false\n })\n\nRun Code Online (Sandbox Code Playgroud)\n
在一般配置中,这有帮助:
{
timestamps: true,
}
Run Code Online (Sandbox Code Playgroud)
后
{
timestamps: true,
underscored: true,
}
Run Code Online (Sandbox Code Playgroud)
小智 5
从laravel迁移到featherjs时,我遇到了同样的错误。表具有列名created_at,updated_at而不是createdat,updatedat。我不得不在Sequelize模型中使用字段名称映射,如下所示
const users = sequelize.define('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true
},
createdAt: {
field: 'created_at',
type: Sequelize.DATE,
},
updatedAt: {
field: 'updated_at',
type: Sequelize.DATE,
},
..
..
..
..
Run Code Online (Sandbox Code Playgroud)
对于 PostgreSQL:
const sequelize = new Sequelize('postgres://user:pass@url:port/dbname',{
define:{
timestamps: false
}
})
Run Code Online (Sandbox Code Playgroud)
不用说,将user、pass、url和port值替换dbname为您的配置值。
| 归档时间: |
|
| 查看次数: |
47252 次 |
| 最近记录: |