Cách tạo Sequelize sử dụng các tên bảng số ít


109

Tôi có một mô hình được gọi là Người dùng nhưng Sequelize tìm kiếm người dùng trong bảng bất cứ khi nào tôi cố gắng lưu trong DB. Có ai biết cách đặt Sequelize để sử dụng các tên bảng số ít không? Cảm ơn.


3
userlà một từ dành riêng, bạn sẽ gặp vô số vấn đề nếu bạn thực sự cố gắng tạo một bảng với tên đó.
a_horse_with_no_name

1
userkhông phải là một từ dành riêng, mà là một từ khóa. Mặc dù bạn sẽ không gặp phải sự cố khi sử dụng nó, nhưng bạn nên tránh nó. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Câu trả lời:


224

Tài liệu nói rằng bạn có thể sử dụng tài sản freezeTableName.

Hãy xem ví dụ này:

var Bar = sequelize.define('Bar', { /* bla */ }, {
  // don't add the timestamp attributes (updatedAt, createdAt)
  timestamps: false,

  // don't delete database entries but set the newly added attribute deletedAt
  // to the current date (when deletion was done). paranoid will only work if
  // timestamps are enabled
  paranoid: true,

  // don't use camelcase for automatically added attributes but underscore style
  // so updatedAt will be updated_at
  underscored: true,

  // disable the modification of tablenames; By default, sequelize will automatically
  // transform all passed model names (first parameter of define) into plural.
  // if you don't want that, set the following
  freezeTableName: true,

  // define the table's name
  tableName: 'my_very_custom_table_name'
})

2
Tôi đã cập nhật liên kết trong câu hỏi của bạn vì nó đã bị hỏng, mong bạn không phiền!
Maria Ines Parnisari

1
freezeTableName: truekhông hoạt động trong phiên bản tiếp theo mới nhất. Bất kỳ giải pháp khác?
Muhammad Yasir

2
Một nhược điểm freezeTableNamelà nó cũng ngăn sqlz từ các tên bảng và cột viết thường. Điều đó có nghĩa là sau này, khi bạn viết tay SQL để tìm hiểu dữ liệu, bạn phải đối mặt với các tên viết hoa lẫn lộn (bất kể điều đó có nghĩa gì đối với phương ngữ của bạn). Trên pg, nó có nghĩa là phải sử dụng dấu ngoặc kép xung quanh mỗi tên viết hoa hỗn hợp - yuk! Tôi ước chúng ta có thể chọn không tham gia đa phương hóa nhưng vẫn giữ nguyên dạng gấp ... definetableNametùy chọn ghi đè rõ ràng.
Tom

1
sử dụng freezeTableName: truethêm vàomodelName: 'singularName'
Naor Levi

97

Mặc dù câu trả lời được chấp nhận là đúng, bạn có thể thực hiện điều này một lần cho tất cả các bảng thay vì phải thực hiện riêng cho từng bảng. Bạn chỉ cần chuyển một đối tượng tùy chọn tương tự vào phương thức khởi tạo Sequelize, như sau:

var Sequelize = require('sequelize');

//database wide options
var opts = {
    define: {
        //prevent sequelize from pluralizing table names
        freezeTableName: true
    }
}

var sequelize = new Sequelize('mysql://root:123abc@localhost:3306/mydatabase', opts)

Bây giờ khi bạn xác định các thực thể của mình, bạn không cần phải chỉ định freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})

3
Cảm ơn bạn đã lưu ý, đây là liên kết đến tài liệu cho những ai quan tâm.
ozanmuyes

0

Nếu bạn yêu cầu có các tên mô hình khác nhau cho các định nghĩa số ít và số nhiều, bạn có thể chuyển tên làm tham số trong các tùy chọn của mô hình.

Hãy xem ví dụ này:

    const People = sequelize.define('people', {
    name: DataTypes.STRING,
}, {
    hooks: {
        beforeCount (options) {
            options.raw = true;
        }
    },
    tableName: 'people',
    name: {
        singular: 'person',
        plural: 'people'
    }
});

điều này sẽ trả về "person" dưới dạng một đối tượng khi một bản ghi đang được truy vấn và "people" dưới dạng một mảng khi chúng tôi tìm nạp nhiều bản ghi.

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.