Sequelize Unknown column '*.createdAt' in 'field list'

前端 未结 6 1780
说谎
说谎 2020-12-12 15:32

I\'m getting a Unknown column \'userDetails.createdAt\' in \'field list\' When trying to fetch with association.

Using findAll without association works

相关标签:
6条回答
  • 2020-12-12 16:06

    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
    
    0 讨论(0)
  • 2020-12-12 16:08

    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
        }
    });
    
    0 讨论(0)
  • 2020-12-12 16:08

    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,
         },
         ..
         ..
         ..
         ..
    
    0 讨论(0)
  • 2020-12-12 16:12

    Disable timestamps Ex:-

    const User = sequelize.define('user', {
        firstName : Sequelize.STRING,
        lastName : Sequelize.STRING,
    }, {
        timestamps: false
    });
    
    0 讨论(0)
  • 2020-12-12 16:13

    I got same error,two solutions:

    1. when create table, add created_at and updated_at column.
    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. disable timestamps
    const Project = sequelize.define('project', {
       title: Sequelize.STRING,
       description: Sequelize.TEXT
     },{
       timestamps: false
     })
    
    
    0 讨论(0)
  • 2020-12-12 16:15

    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.

    0 讨论(0)
提交回复
热议问题