为什么Sequelize将所有内容的名字复数化/单一化?以及如何完全阻止它?

时间:2018-05-28 18:11:14

标签: node.js sequelize.js

.create()方法函数和模型定义中的表的名称从单数变为复数,反之亦然。 为什么Sequelize会拥有此功能?为什么禁用它会如此不稳定?

我的数据库中的表名称(如代码中)"用户","电子邮件","设置"。但是当执行INSERT和SELECT SQL语句时,Sequelize将名称单个化,好像我需要一个库来为我的数据库表选择最佳名称!因此,一些INSERT失败。

这是我的代码:

// DEPENDENCIES
const Sequelize = require('sequelize');



// Connection set up:
const sequelize = new Sequelize(
    'sql_database_1',
    'sqlusername1',
    'dbpassw0rd',
    { // Sequelize options:
        host: 'localhost',
        port: 3306,
        dialect: 'mysql',
        operatorsAliases: false,
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        },
        logging: console.log,
        define: {
            freezeTableName: true, // Do not change my table names.
            timestamps: false // I will do this individually, thanks.
        },
    });



// Set up models:
const User = sequelize.define('user',
    { // Database columns:
        user_id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        column1: Sequelize.STRING,
    });

const Settings = sequelize.define('settings',
    { // Database columns:
        entry_id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        owner_id: Sequelize.INTEGER,
        column1: Sequelize.STRING
    });

const Email = sequelize.define('email',
    { // Database columns:
        entry_id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        owner_id: Sequelize.INTEGER,
        column1: Sequelize.STRING
    });



// Set up associations:
User.hasOne(Settings,
    { // Options:
        foreignKey: 'owner_id'
    });

User.hasMany(Email,
    { // Options:
        foreignKey: 'owner_id'
    });



// Actions:
sequelize
    .sync({
        force: true
    })
    .then(function() {
        User
            .create({
                    column1: 'test123',
                    settings: { // STACK OVERFLOW: Not working because of Sequelize singularizing the name.
                        column1: 'This is dummy address'
                    },
                    emails: [ // STACK OVERFLOW: I need to write this table name in plural to work because Sequelize is changing MY names...
                        { column1: 'Some data here' },
                        { column1: 'Other data there' }
                    ],
                },
                {
                    include: [Settings, Email]
                })
    })
    .then(function() {
        User
            .findOne({
                include: [Settings, Email],
            })
            .then(function(result) {
                console.log('FindAll results:\n', JSON.stringify(result));
            });
    });

正如您所看到的,我正在使用" define:{freezeTableName:true}"在专用于设置Sequelize选项的对象中。它仅在创建新表名时起作用:它不会使它们多元化。 INSERT和SELECT语句仍有类似的问题:它们正在被单一化。

这可能是个错误吗?

1 个答案:

答案 0 :(得分:0)

它与您定义的关联有关。对于设置,我们有hasOne关系。因此这个名字是单数的。对于电子邮件,我们有hasMany,而且还有复数。

让我们看一下下面的例子。

const User = sequelize.define('user', {
  username: Sequelize.STRING,
});

const Email = sequelize.define('emails', {
  text: Sequelize.STRING,
});


User.hasMany(Email);

sequelize.sync({ force: true })
  .then(() => User.create({
    username: 'test1234',
    emails: {
      text: 'this is dummy Email123'
    },
  }, { include: [Email] }))
  .then(user => {
    console.log(user.dataValues);
  });

我使用emails因为UserhasManyEmail的关系。 如果我将关系类型更改为hasOne,我将不得不使用单数名称。

const User = sequelize.define('user', {
  username: Sequelize.STRING,
});

const Email = sequelize.define('emails', {
  text: Sequelize.STRING,
});


User.hasOne(Email);

sequelize.sync({ force: true })
  .then(() => User.create({
    username: 'test1234',
    email: {
      text: 'this is dummy Email123'
    },
  }, { include: [Email] }))
  .then(user => {
    console.log(user.dataValues);
  });