Sequelize가 단일 테이블 이름을 사용하도록 만드는 방법


109

User라는 모델이 있지만 Sequelize는 DB에 저장하려고 할 때마다 테이블 USERS를 찾습니다. 누구든지 단일 테이블 이름을 사용하도록 Sequelize를 설정하는 방법을 알고 있습니까? 감사.


3
user예약어이므로 해당 이름으로 테이블을 실제로 만들려고하면 많은 문제가 발생합니다.
a_horse_with_no_name 2014 년

1
user예약어가 아니라 키워드입니다. 사용하는 데 문제가 발생하지는 않지만 피하는 것이 좋습니다. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

답변:


224

속성을 사용할 수 있는 문서 상태입니다 freezeTableName.

이 예를 살펴보십시오.

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
문제가 발생했기 때문에 귀하의 질문에있는 링크를 업데이트했습니다. 괜찮 으시길 바랍니다.
Maria Ines Parnisari

1
freezeTableName: true최신 버전의 sequelize에서 작동하지 않습니다. 다른 해결책이 있습니까?
Muhammad Yasir 19

2
한 가지 단점 freezeTableName이 있다는 것입니다 또한 테이블 및 열 이름을 lowercasing에서 sqlz 방지 할 수 있습니다. 즉, 나중에 데이터를 조사하기 위해 SQL을 손으로 작성할 때 대소 문자가 혼합 된 이름에 대처해야합니다. pg에서는 대소 문자가 혼합 된 모든 이름을 큰 따옴표로 묶어야한다는 의미입니다-yuk! 나는 우리가 복수화의 아웃 선택하지만, 대소 폴딩을 유지할 수 있으면 좋겠다 ... definetableName명시 적으로 재정에 대한 옵션을 선택합니다.
Tom

1
freezeTableName: true추가 사용modelName: 'singularName'
Naor Levi

97

허용되는 대답은 정확하지만 각 테이블에 대해 개별적으로 수행 할 필요없이 모든 테이블에 대해 한 번만 수행 할 수 있습니다. 다음과 같이 유사한 옵션 객체를 Sequelize 생성자에 전달하기 만하면됩니다.

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)

이제 엔티티를 정의 할 때 다음을 지정할 필요가 없습니다 freezeTableName: true.

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

3
미리 알려 주셔서 감사합니다. 여기에 관심있는 분들을위한 문서 링크가 있습니다 .
ozanmuyes 2010

0

singuar 및 복수 정의에 대해 서로 다른 모델 이름이 필요한 경우 모델 옵션에서 이름을 매개 변수로 전달할 수 있습니다.

이 예를 살펴보십시오.

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

이것은 단일 레코드가 쿼리 될 때 객체로 "person"을 반환하고 여러 레코드를 가져올 때 배열로 "people"을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.