SequelizeJS中的自定义PostgreSQL序列Nextval

6

如何在SequelizeJS Model中定义序列nextval()

SequelizeJS 中是否有预定义的nextval()函数可用?

在Sequelize定义模型时,是否有可能编写自定义函数来实现序列nextval()

5个回答

3

如果有人也想这么做,我认为最好的方法是使用Sequelize.literal

// on your model

const model = sequelize.define("model", {
  ...attributes,
  customSequence: {
    type: DataTypes.INTEGER,
    allowNull: false,
    defaultValue: sequelize.Sequelize.literal("nextval('custom_sequence')")
  },
})

// after create a migration for your new column

module.exports = {
  up: async (queryInterface, sequelize) => {
    await queryInterface.sequelize.query("CREATE SEQUENCE custom_sequence start 1020 increment 20",)

    await queryInterface.addColumn('table', 'customSequence', {
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: sequelize.Sequelize.literal("nextval('custom_sequence')")
    })
  },

  down: async (queryInterface, sequelize) => {
    await queryInterface.sequelize.query('DROP SEQUENCE custom_sequence')
    await queryInterface.removeColumn('table', 'customSequence')
  }
};


这个会像PostGres的nextVal()一样处理潜在的竞态条件吗? - VikR
老实说,我不太确定,但我猜它会,因为它将在编写时执行。 - Elias Rodelo

2

2

没有预定义的函数可以实现这个功能。但是你可以使用原始查询并使用 nextval 来实现:

sequelize.query("SELECT nextval('sequence')", { 
 type: collection.Sequelize.QueryTypes.SELECT 
});

0

这在 MSSQL / MariaDB 中完美运行。

Sequelize.literal 在 "defaultValue" 中是关键。 我对 Sequelize 还很陌生,幸运的是它让我重新定义了 "id" 字段,这个字段通常不需要在模型中指定。 对我来说是个好消息。

module.exports = (sequelize, Sequelize) => {
const People = sequelize.define("people", {
id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    allowNull: false,
    defaultValue: sequelize.Sequelize.literal("NEXT VALUE FOR dbo.BAS_IDGEN_SEQ")
},...

0

我能够像@sebin发布的那样做类似的事情,并将承诺链接到我的model.create(),就像这样:

  this.sequelize
    .query("SELECT max(cust_no) + 1 as 'custNo' from employees.customers", {
      type: this.sequelize.Sequelize.QueryTypes.SELECT
    })
    .then(results => {
      return results[0];
    })
    .then(nextPk => {
      const values = Object.assign({}, newCustomer, nextPk);
      return customersModel.create(values);
    })
    .then(newRecord => {
      console.log('newRecord:', newRecord);
    });

在上述情况中,我使用了max +1,但解决方案同样适用于您的序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接