วิธีสร้าง Sequelize ให้ใช้ชื่อตารางเอกพจน์


109

ฉันมีโมเดลที่เรียกว่า User แต่ Sequelize จะค้นหา USERS ตารางเมื่อใดก็ตามที่ฉันพยายามบันทึกใน DB ใครทราบวิธีตั้งค่า Sequelize ให้ใช้ชื่อตารางเอกพจน์ ขอบคุณ.


3
userเป็นคำสงวนคุณจะมีปัญหามากมายหากคุณพยายามสร้างตารางด้วยชื่อนั้นจริงๆ
a_horse_with_no_name

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

2
ข้อเสียอย่างหนึ่งfreezeTableNameคือมันยังป้องกัน sqlz จากชื่อตารางและคอลัมน์ที่ต่ำกว่า ซึ่งหมายความว่าในภายหลังเมื่อคุณเขียน SQL ด้วยมือเพื่อขุดดูข้อมูลคุณต้องรับมือกับชื่อกรณีผสม (ไม่ว่าจะหมายถึงภาษาถิ่นของคุณก็ตาม) ใน pg หมายความว่าต้องใช้เครื่องหมายคำพูดคู่รอบ ๆ ชื่อตัวพิมพ์เล็ก ๆ ทุกตัว - yuk! ผมหวังว่าเราจะเลือกที่จะไม่ pluralization แต่รักษากรณีพับ ... defineมีtableNameตัวเลือกสำหรับการแทนที่อย่างชัดเจน
ทอม

1
ใช้freezeTableName: trueนอกเหนือจากmodelName: 'singularName'
Naor Levi

98

แม้ว่าคำตอบที่ยอมรับจะถูกต้อง แต่คุณสามารถทำได้ครั้งเดียวสำหรับทุกตารางแทนที่จะต้องแยกกันสำหรับแต่ละตาราง คุณเพียงแค่ส่งอ็อบเจ็กต์ตัวเลือกที่คล้ายกันไปยังตัวสร้าง 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

0

หากคุณต้องการให้มีชื่อโมเดลที่แตกต่างกันสำหรับนิยามเอกพจน์และพหูพจน์คุณสามารถส่งชื่อเป็นพารามิเตอร์ในตัวเลือกของโมเดล

โปรดดูตัวอย่างนี้:

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

สิ่งนี้จะส่งคืน "บุคคล" เป็นวัตถุเมื่อมีการสืบค้นระเบียนเดียวและ "บุคคล" เป็นอาร์เรย์เมื่อเราดึงข้อมูลหลายระเบียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.