【问题标题】:Sequelize Unknown column '*.createdAt' in 'field list'续集“字段列表”中的未知列“* .createdAt”
【发布时间】:2013-12-21 14:10:58
【问题描述】:

我在“字段列表”中得到一个未知列“userDetails.createdAt” 尝试通过关联获取时。

在没有关联的情况下使用findAll 可以正常工作。

我的代码如下:

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

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    在一般配置中这有帮助:

    {
      timestamps: true,
    }
    

    之后

    {
      timestamps: true,
      underscored: true,
    }
    

    【讨论】:

      【解决方案2】:

      对于 postgresql:

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

      不用说,用您的配置值替换 user,pass,url,portdbname 值。

      【讨论】:

        【解决方案3】:

        同样的错误,两种解决方法:

        1. 创建表时,添加 created_at 和 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. 禁用时间戳
        const Project = sequelize.define('project', {
           title: Sequelize.STRING,
           description: Sequelize.TEXT
         },{
           timestamps: false
         })
        
        

        【讨论】:

          【解决方案4】:

          好吧,也许为时已晚,但你可以在迁移时创建 createdAt、updatedAt

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

          我正在使用 express 和 sequelize mysql 然后模型就像正常定义一样 例如:

          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
          

          【讨论】:

            【解决方案5】:

            禁用时间戳 例如:-

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

            【讨论】:

              【解决方案6】:

              在将我们的项目从 laravel 迁移到 featherjs 时,我遇到了同样的错误。表的列名称为 created_at、updated_at 而不是 createdat、updateat。我必须在 Sequelize 模型中使用字段名称映射,如下所示

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

              【讨论】:

                【解决方案7】:

                我认为错误是您在 sequelize 中启用了时间戳,但您在数据库中的实际表定义不包含时间戳列。

                当您执行 user.find 时,它只会执行SELECT user.*,它只会占用您实际拥有的列。但是当你 join 时,joined table 的每一列都会有别名,这会创建以下查询:

                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`;
                

                解决方法是禁用 userDetails 模型的时间戳:

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

                或适用于所有型号:

                var sequelize = new Sequelize('sequelize_test', 'root', null, {
                    host: "127.0.0.1",
                    dialect: 'mysql',
                    define: {
                        timestamps: false
                    }
                });
                

                【讨论】:

                • 这没有意义,因为这不再是续集模型的外观了。在字段列表之后是​​类和实例方法
                • 这很烦人。我没有问题,timestamps: false 就足够了,但是突然 Sequelize 在外键列中的特定表的 SELECT 中添加了一个`.createdAt`。然后我需要在 Sequelize 实例化中包含define: { timestamps: false },它对我有用。
                猜你喜欢
                • 2018-10-31
                • 2021-09-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-12-09
                • 2023-03-14
                相关资源
                最近更新 更多