Sắp xếp theo thứ tự cột Không xác định '* .createAt' trong 'danh sách trường'


101

Tôi nhận được cột Không xác định 'userDetails.createAt' trong 'danh sách trường' Khi cố gắng tìm nạp bằng liên kết.

Sử dụng findAllmà không có liên kết hoạt động tốt.

Mã của tôi như sau:

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

Câu trả lời:


208

Tôi nghĩ rằng lỗi là bạn đã bật dấu thời gian trong phần tiếp theo, nhưng các định nghĩa bảng thực tế của bạn trong DB không chứa cột dấu thời gian.

Khi bạn thực hiện user.find, nó sẽ hoạt động SELECT user.*, chỉ lấy các cột bạn thực sự có. Nhưng khi bạn tham gia, mỗi cột của bảng đã tham gia sẽ có bí danh, điều này tạo ra truy vấn sau:

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

Cách khắc phục sẽ là tắt dấu thời gian cho mô hình userDetails:

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

hoặc cho tất cả các mô hình:

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

1
điều này không có ý nghĩa vì đó không phải là cách một mô hình tiếp theo trông như thế nào nữa. sau danh sách trường là class và instancemethods
Travis Delly

Điều này khá khó chịu. Tôi không gặp vấn đề gì, timestamps: falselà đủ, nhưng đột nhiên Sequelize thêm a` .createAt` vào phần CHỌN của một bảng cụ thể, trong cột khóa ngoại. Sau đó, tôi cần phải đưa define: { timestamps: false }vào trình tự tạo Trình tự và nó đã hoạt động với tôi.
Jeff Pal

8

Tôi gặp lỗi tương tự khi di chuyển dự án của chúng tôi từ laravel sang furjs. Các bảng có tên cột là create_at, updated_at thay vì createat, updatedat. Tôi đã phải sử dụng ánh xạ tên trường trong các mô hình Sequelize như dưới đây

  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

Tôi gặp cùng một lỗi, hai giải pháp :

  1. khi tạo bảng, hãy thêm cột create_at và 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. tắt dấu thời gian
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })


1

Tắt dấu thời gian Ví dụ: -

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

0

tốt, có thể quá muộn nhưng bạn có thể tạo createAt, updatedAt khi di chuyển như

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

Tôi đang sử dụng mysql thể hiện và tiếp theo thì mô hình chỉ xác định như bình thường đối với ví dụ:

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

Đối với postgresql:

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

Không cần phải nói, thay thế user, pass, url, portdbnamegiá trị với các giá trị cấu hình của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.