如何在SequelizeJS Model中定义序列nextval()
?
SequelizeJS 中是否有预定义的nextval()
函数可用?
在Sequelize定义模型时,是否有可能编写自定义函数来实现序列nextval()
?
如何在SequelizeJS Model中定义序列nextval()
?
SequelizeJS 中是否有预定义的nextval()
函数可用?
在Sequelize定义模型时,是否有可能编写自定义函数来实现序列nextval()
?
如果有人也想这么做,我认为最好的方法是使用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')
}
};
没有预定义的函数可以实现这个功能。但是你可以使用原始查询并使用 nextval 来实现:
sequelize.query("SELECT nextval('sequence')", {
type: collection.Sequelize.QueryTypes.SELECT
});
这在 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")
},...
我能够像@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);
});
nextVal()
一样处理潜在的竞态条件吗? - VikR