sequelize 虚拟列 创建索引 提示Key column 'openDate' doesn't exist in table
时间: 2024-03-08 18:50:35 浏览: 169
C++程序设计课程设计银行账户管理系统源程序.doc
5星 · 资源好评率100%
虚拟列是指在数据库表中不存在的列,但是可以通过计算或者其他方式得到其值。在 Sequelize 中,可以使用 `Sequelize.literal` 方法来定义虚拟列。如果你想要给虚拟列创建索引,需要使用 `Sequelize.fn` 方法来创建一个函数,并将其作为参数传递给 `Sequelize.literal` 方法。例如,如果你想要在一个名为 `example` 的表中创建一个名为 `virtualColumn` 的虚拟列,并在该列上创建一个索引,可以按照以下步骤进行操作:
1. 在定义模型时,使用 `Sequelize.literal` 方法定义虚拟列,并通过 `Sequelize.fn` 方法创建一个函数,将其作为参数传递给 `Sequelize.literal` 方法。例如:
```
const Example = sequelize.define('example', {
// ...
virtualColumn: {
type: DataTypes.VIRTUAL,
get() {
// ...
},
set(value) {
// ...
},
allowNull: false,
validate: {
// ...
},
// 创建索引
indexes: [
{
fields: [Sequelize.literal('LOWER(STRFTIME(\'%d-%m-%Y\', openDate))')],
},
],
},
});
```
2. 在创建表时,使用 `Sequelize.literal` 方法创建虚拟列所需的 SQL 语句。例如:
```
await queryInterface.addColumn('example', 'virtualColumn', {
type: Sequelize.VIRTUAL,
get() {
return Sequelize.literal(
'LOWER(STRFTIME(\'%d-%m-%Y\', openDate))'
);
},
});
```
需要注意的是,虚拟列不会在数据库表中创建实际的列,因此在创建索引时不能直接使用虚拟列的名称。需要使用虚拟列所依赖的列的名称或者 SQL 表达式来定义索引。如果你在创建索引时使用虚拟列的名称,会出现 `Key column 'virtualColumn' doesn't exist in table` 的错误提示。
阅读全文