Sequelizar columna desconocida '* .createdAt' en 'lista de campos'

101

Recibo una columna desconocida 'userDetails.createdAt' en 'lista de campos' cuando intento buscar con asociación.

El uso findAllsin 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)
});
David Limkys
fuente

Respuestas:

208

Creo que el error es que tiene las marcas de tiempo habilitadas en la secuencia, pero sus definiciones de tabla reales en la base de datos no contienen una columna de marca de tiempo.

Cuando hagas user.find, simplemente funcionará SELECT user.*, lo que solo toma las columnas que realmente tienes. Pero cuando se une, 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
    }
});
Jan Aagaard Meier
fuente
1
esto no tiene sentido porque ya no es así como se ve un modelo de secuenciación. después de la lista de campos está la clase y los
métodos de
Esto es bastante molesto. No tenía ningún problema, timestamps: falseera suficiente, pero de repente el Sequelize agregó un` .createdAt` al SELECT de una tabla específica, en una columna de clave externa. Luego necesitaba incluirlo define: { timestamps: false }en la instanciación de Sequelize y funcionó para mí.
Jeff Pal
8

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 la asignación 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,
     },
     ..
     ..
     ..
     ..
Pramod
fuente
3

Tengo el mismo error, dos soluciones:

  1. cuando cree la tabla, agregue la columna 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';
  1. deshabilitar marcas de tiempo
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })
zhuxy
fuente
1

Desactivar marcas de tiempo Ex: -

const User = sequelize.define('user', {
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
}, {
    timestamps: false
});
MAITRAIYA MALI
fuente
0

bueno, tal vez sea demasiado tarde, pero puede crear createdAt, updatedAt cuando la migración como

      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.fn('now'),
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.fn('now'),
        type: Sequelize.DATE
      }

Estoy usando express y sequelize mysql, luego el modelo simplemente se define como normal para 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
Mark Sparrow
fuente
0

Para postgresql:

const sequelize = new Sequelize('postgres://user:pass@url:port/dbname',{ 
    define:{
        timestamps: false
    }
})

Huelga decir que, en lugar de user, pass, url, porty dbnamevalores con los valores de configuración.

Pravin Divraniya
fuente