Sequelize'nin tekil tablo adlarını kullanmasını sağlama


109

Kullanıcı adında bir modelim var ama Sequelize, ne zaman DB'ye kaydetmeye çalışsam KULLANICILAR tablosunu arıyor. Tekil tablo adlarını kullanmak için Sequelize'yi nasıl ayarlayacağını bilen var mı? Teşekkürler.


3
userayrılmış bir kelimedir, gerçekten o isimde bir tablo oluşturmaya çalışırsanız bir sürü problem yaşarsınız.
a_horse_with_no_name

1
userayrılmış bir kelime değil, bir anahtar kelimedir. Kullanırken bir sorunla karşılaşmayacak olsanız da, bundan kaçınmak iyidir. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Yanıtlar:


224

Docs Eğer özelliğini kullanabilirsiniz belirtmektedirler freezeTableName.

Lütfen bu örneğe bir göz atın:

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
Sorunuzdaki bağlantıyı bozuk olduğu için güncelledim, umarım aldırmazsınız!
Maria Ines Parnisari

1
freezeTableName: truesekelize etmenin son sürümünde çalışmıyor. Başka bir çözüm var mı?
Muhammad Yasir

2
İçin bir dezavantajı freezeTableNametam o zamanda tablo ve sütun isimleri lowercasing gelen sqlz engeller. Bu, daha sonra, verileri araştırmak için SQL'i elle yazarken, karışık harfli isimlerle (lehçeniz için ne anlama geliyorsa) baş etmeniz gerektiği anlamına gelir. Pg'de, her karışık harfli adın etrafında çift tırnak kullanmak anlamına gelir - yuk! Bence pluralization of-çıkma ancak dava katlama korumak isterdim ... definesahip tableNameaçık geçersiz kılmak için bir seçenek.
Tom

1
freezeTableName: trueek olarak kullanınmodelName: 'singularName'
Naor Levi

97

Kabul edilen cevap doğru olsa da, her biri için ayrı ayrı yapmak zorunda kalmadan bunu tüm tablolar için bir kez yapabilirsiniz. Benzer bir options nesnesini Sequelize yapıcısına iletirsiniz, örneğin:

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)

Artık varlıklarınızı tanımladığınızda şunları belirtmeniz gerekmez freezeTableName: true:

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

3
Uyarı için teşekkürler, ilgilenenler için dokümantasyon bağlantısı burada .
ozanmuyes

0

Tekil ve çoğul tanımlamalar için farklı model adlarına ihtiyacınız varsa, model seçeneklerinde adı bir parametre olarak geçirebilirsiniz.

Lütfen bu örneğe bir göz atın:

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

bu, tek bir kayıt sorgulandığında "kişi" yi bir nesne olarak ve birden fazla kaydı getirdiğimizde bir dizi olarak "insanları" döndürecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.