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)
});

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
    }
});

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,
     },
     ..
     ..
     ..
     ..

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
 })

1

Desactivar marcas de tiempo Ex: -

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

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.