乐闻世界logo
搜索文章和话题

Use Postgres generated columns in Sequelize model

4 个月前提问
3 个月前修改
浏览次数11

1个答案

1

在Sequelize中,使用PostgreSQL的生成列(computed columns)可以极大地提升数据库的性能和数据的一致性。生成列是基于其他列的值计算得出的,这意味着它的值是动态生成的,不需要手动更新。

定义生成列

在PostgreSQL中,生成列通常在表定义时就指定。比如,如果我们有一个员工表,其中包含员工的名字和姓氏,我们可以创建一个生成列来自动构建全名。

sql
CREATE TABLE employees ( first_name VARCHAR(100), last_name VARCHAR(100), full_name VARCHAR(205) GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED );

在上面的SQL语句中,full_name是一个生成列,它总是会根据first_namelast_name的值来自动更新。

在Sequelize中引用生成列

在Sequelize模型中,虽然我们不能直接定义生成列,但我们可以引用它。我们需要确保模型与数据库表结构一致。这里是如何定义上述employees表的Sequelize模型:

javascript
const Employee = sequelize.define('employee', { first_name: { type: Sequelize.STRING, }, last_name: { type: Sequelize.STRING, }, full_name: { type: Sequelize.STRING, allowNull: false } }, { tableName: 'employees', timestamps: false });

请注意,在这个模型中,我们没有指定full_name是一个生成列,因为Sequelize目前不支持直接在模型定义中创建生成列。我们只是在模型中引用它,以确保应用程序能够正确处理从数据库读取的数据。

使用生成列

由于生成列由数据库自动管理,因此你不需要在应用程序中为full_name赋值。当你创建或更新first_namelast_name时,PostgreSQL会自动更新full_name

javascript
async function createEmployee(firstName, lastName) { const employee = await Employee.create({ first_name: firstName, last_name: lastName }); console.log(`Full name is automatically generated: ${employee.full_name}`); } createEmployee('John', 'Doe');

在这个例子中,尽管我们没有直接设置full_name,输出将显示全名是由PostgreSQL自动计算并填充的。

总结

使用生成列可以使数据库的操作更加高效和安全。虽然Sequelize不支持直接定义生成列,但可以通过适当的表设计和模型定义来利用这些特性,以保持代码的整洁和数据的一致性。这种方法减少了应用层需要执行的计算量,并将数据的维护责任委托给了数据库。

2024年8月8日 23:14 回复

你的答案