如何使Sequelize使用单数表名

99 mysql sql node.js sequelize.js

我有一个名为User的模型,但每当我尝试保存在DB中时,Sequelize会查找表USERS.有谁知道如何设置Sequelize使用奇异的表名?谢谢.

Lui*_*ría 199

文档,你可以使用属性状态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'
})
Run Code Online (Sandbox Code Playgroud)

  • “freezeTableName”的一个缺点是它还阻止 sqlz 将表名和列名小写。这意味着稍后,当您手写 SQL 来挖掘数据时,您必须处理大小写混合的名称(无论这对您的方言意味着什么)。在 pg 上,这意味着必须在每个大小写混合的名称周围使用双引号 - yuk!我希望我们可以选择退出复数,但保留大小写折叠...“define”具有用于显式覆盖的“tableName”选项。 (3认同)
  • 我已经更新了你问题中的链接,因为它被破坏了,希望你不介意! (2认同)
  • `freezeTableName: true` 在最新版本的sequelize 中不起作用。还有其他解决方案吗? (2认同)

d51*_*512 92

虽然接受的答案是正确的,但您可以对所有表格执行此操作,而不必为每个表格单独执行此操作.您只需将类似的选项对象传入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)
Run Code Online (Sandbox Code Playgroud)

现在,当您定义实体时,您不必指定freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的注意,对于那些感兴趣的人,这里是[文档链接](http://docs.sequelizejs.com/manual/installation/getting-started.html#application-wide-model-options)。 (2认同)

小智 8

如果您需要为单数和复数定义使用不同的模型名称,您可以将名称作为模型选项中的参数传递。

请看一下这个例子:

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

当查询单个记录时,这将返回“person”作为对象;当我们获取多个记录时,这将返回“people”作为数组。


Ary*_*rya 6

你可以直接做,而不是在你定义的每个表中指定一次,如下所示

var db_instance = new Sequelize(config.DB.database, config.DB.username, config.DB.password, {
  host: config.DB.host,
  dialect: config.DB.dialect,
  define: {
    timestamps: true,
    freezeTableName: true
  },
  logging: false
});  

Run Code Online (Sandbox Code Playgroud)

或者

您也可以直接告诉 Sequelize 表的名称:

sequelize.define('User', {
  // ... (attributes)
}, {
  tableName: 'Employees'
});
Run Code Online (Sandbox Code Playgroud)

您可以在 sequelize.js 的文档中看到这两种方法

医生。sequelize.js 相关的freezeTableName