Sequelizar coluna Desconhecida '* .createdAt' na 'lista de campos'

101

Estou recebendo uma coluna Desconhecida 'userDetails.createdAt' na 'lista de campos' ao tentar obter com associação.

Usando findAll sem associação funciona bem.

Meu código é o seguinte:

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
fonte

Respostas:

208

Acho que o erro é que você tem carimbos de data / hora habilitados no sequelize, mas suas definições de tabela reais no banco de dados não contêm uma coluna de carimbo de data / hora.

Quando você faz user.find, ele simplesmente faz SELECT user.*, o que leva apenas as colunas que você realmente tem. Mas quando você une, cada coluna da tabela unida terá um alias, o que cria a seguinte 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`;

A correção seria desativar os carimbos de data / hora para o modelo userDetails:

var userDetails = sequelize.define('userDetails', {
    userId :Sequelize.INTEGER,
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
    birthday : Sequelize.DATE
}, {
    timestamps: false
});

ou para todos os modelos:

var sequelize = new Sequelize('sequelize_test', 'root', null, {
    host: "127.0.0.1",
    dialect: 'mysql',
    define: {
        timestamps: false
    }
});
Jan Aagaard Meier
fonte
1
isso não faz sentido porque não é mais a aparência de um modelo sequencial. depois que a lista de campos vem métodos de classe e instância
Travis Delly
Isso é muito chato. Não estava tendo nenhum problema, timestamps: falsebastava, mas de repente o Sequelize adicionou um `.createdAt` ao SELECT de uma tabela específica, em uma coluna de chave estrangeira. Então eu precisei incluir define: { timestamps: false }na instanciação Sequelize e funcionou para mim.
Jeff Pal
8

Recebi o mesmo erro ao migrar nosso projeto de laravel para featherjs. As tabelas têm nomes de colunas created_at, updated_at em vez de createdat, updatedat. Tive que usar o mapeamento de nome de campo em modelos Sequelize conforme fornecido abaixo

  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
fonte
3

Recebi o mesmo erro, duas soluções:

  1. ao criar a tabela, adicione as colunas created_at e 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. desativar carimbos de data / hora
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })
Zhuxy
fonte
1

Desativar carimbos de data / hora Ex: -

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

bem, talvez tarde demais, mas você pode criar createdAt, updatedAt quando a migração, como

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

Estou usando o Express e sequelize o mysql, então o modelo apenas 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
fonte
0

Para postgresql:

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

Escusado será dizer, substitua user, pass, url, porte dbnamevalores com os valores de configuração.

Pravin Divraniya
fonte