web-dev-qa-db-ja.com

「フィールドリスト」の不明な列「* .createdAt」を後処理します

関連付けで取得しようとすると、「フィールドリスト」に「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)
});
78
David Limkys

エラーは、sequelizeでタイムスタンプを有効にしているが、DBの実際のテーブル定義にタイムスタンプ列が含まれていないことだと思います。

User.findを実行すると、SELECT user.*、実際に持っている列のみを取得します。ただし、結合すると、結合されたテーブルの各列にエイリアスが作成され、次のクエリが作成されます。

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

プロジェクトをlaravelからfeatherjsに移行する際に同じエラーが発生しました。テーブルの列名はcreatedat、updatedatではなくcreated_at、updated_atです。

  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
Pramod

私は同じエラーを受け取りました、2つの解決策:

  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 Proje

ct = sequelize.define('project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
},{
    timestamps: false
})
1
zhuxy