node.js - underscored - sequelize mayor que
Secuela de la columna desconocida ''*.createdAt'' en ''lista de campos'' (3)
Obtengo una columna desconocida ''userDetails.createdAt'' en ''lista de campos'' Al intentar obtener una asociación.
Usar findAll
sin asociación funciona bien.
Mi código es el siguiente:
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)
});
Creo que el error es que tiene marcas de tiempo habilitadas en la secuencia, pero sus definiciones de tabla reales en el DB no contienen una columna de marca de tiempo.
Cuando hagas user.find solo hará SELECT user.*
, Que solo toma las columnas que realmente tienes. Pero cuando te unes, cada columna de la tabla unida tendrá un alias, lo que crea la siguiente consulta:
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`;
La solución sería deshabilitar las marcas de tiempo para el modelo userDetails:
var userDetails = sequelize.define(''userDetails'', {
userId :Sequelize.INTEGER,
firstName : Sequelize.STRING,
lastName : Sequelize.STRING,
birthday : Sequelize.DATE
}, {
timestamps: false
});
o para todos los modelos:
var sequelize = new Sequelize(''sequelize_test'', ''root'', null, {
host: "127.0.0.1",
dialect: ''mysql'',
define: {
timestamps: false
}
});
Recibí el mismo error al migrar nuestro proyecto de laravel a featherjs. Las tablas tienen nombres de columna created_at, updated_at en lugar de createdat, updatedat. Tuve que usar el mapeo de nombres de campo en los modelos Sequelize como se indica a continuación
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,
},
..
..
..
..
Tengo el mismo error, dos soluciones:
- cuando cree la tabla, agregue las columnas created_at y updated_at.
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'';
- deshabilitar las marcas de tiempo
const Proje
ct = sequelize.define(''project'', {
title: Sequelize.STRING,
description: Sequelize.TEXT
},{
timestamps: false
})