Reputation: 5123
I'm getting a Unknown column 'userDetails.createdAt' in 'field list' When trying to fetch with association.
Using findAll
without association works fine.
My code is as follows:
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)
});
Upvotes: 143
Views: 136063
Reputation: 18212
In the general config this helped:
{
timestamps: true,
}
After
{
timestamps: true,
underscored: true,
}
Upvotes: 10
Reputation: 4376
For postgresql:
const sequelize = new Sequelize('postgres://user:pass@url:port/dbname',{
define:{
timestamps: false
}
})
Needless to say, replace user
,pass
,url
,port
and dbname
values with your configuration values.
Upvotes: 6
Reputation: 140
I got same error,two solutions:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`name` varchar(30) DEFAULT NULL COMMENT 'user name',
`created_at` datetime DEFAULT NULL COMMENT 'created time',
`updated_at` datetime DEFAULT NULL COMMENT 'updated time',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='user';
const Project = sequelize.define('project', {
title: Sequelize.STRING,
description: Sequelize.TEXT
},{
timestamps: false
})
Upvotes: 9
Reputation: 308
well, maybe too late but you can create createdAt, updatedAt when migration like
createdAt: {
allowNull: false,
defaultValue: Sequelize.fn('now'),
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
defaultValue: Sequelize.fn('now'),
type: Sequelize.DATE
}
Im using express and sequelize mysql then the model just define like normal for ex:
module.exports = (sequelize, DataTypes) => {
const Customer = sequelize.define('customer', {
name: DataTypes.STRING,
email: DataTypes.STRING,
phone: DataTypes.TEXT,
consider: DataTypes.TEXT,
otherQuestion: DataTypes.TEXT
}, {})
return Customer
Upvotes: 1
Reputation: 99
Disable timestamps Ex:-
const User = sequelize.define('user', {
firstName : Sequelize.STRING,
lastName : Sequelize.STRING,
}, {
timestamps: false
});
Upvotes: 3
Reputation: 774
I got the same error when migrating our project from laravel to featherjs. Tables are having column names created_at, updated_at instead of createdat, updatedat. I had to use field name mapping in Sequelize models as given below
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,
},
..
..
..
..
Upvotes: 19
Reputation: 28778
I think the error is that you have timestamps enabled in sequelize, but your actual table definitions in the DB do not contain a timestamp column.
When you do user.find it will just do SELECT user.*
, which only takes the columns you actually have. But when you join, each column of the joined table will be aliased, which creates the following query:
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`;
The fix would be to disable timestamps for either the userDetails model:
var userDetails = sequelize.define('userDetails', {
userId :Sequelize.INTEGER,
firstName : Sequelize.STRING,
lastName : Sequelize.STRING,
birthday : Sequelize.DATE
}, {
timestamps: false
});
or for all models:
var sequelize = new Sequelize('sequelize_test', 'root', null, {
host: "127.0.0.1",
dialect: 'mysql',
define: {
timestamps: false
}
});
Upvotes: 298