在使用 Sequelize 操作 PostgreSQL 数据库的过程中,有些开发者可能会遇到 “SequelizeDatabaseError: column "createdAt" does not exist” 错误。在这篇文章中,我们将探讨这个错误的原因以及如何解决它。
什么是 Sequelize?
Sequelize 是一个用于 Node.js 的 ORM(对象关系映射)库,它支持多种数据库,包括 PostgreSQL、MySQL、SQLite、MSSQL 等。使用 Sequelize,开发者可以通过 JavaScript 代码操作数据库,而无需编写 SQL 语句。
在 Sequelize 中,每一个数据模型都对应着数据库中的一张表。 每个数据模型都定义了需要进行的操作,定义包括字段名称,数据类型,以及字段间的关系。
问题描述
在使用 Sequelize 操作 PostgreSQL 数据库时,有些开发者可能会遇到以下错误:
SequelizeDatabaseError: column "createdAt" does not exist"
这个错误通常出现在创建一个新的数据表时。下面是一个在 Sequelize 中创建数据表时可能会遇到此问题的示例代码:
// javascriptcn.com 代码示例 const sequelize = new Sequelize({ database: 'test', username: 'postgres', password: 'password', host: 'localhost', dialect: 'postgres', }); const Book = sequelize.define('book', { title: Sequelize.STRING, }); (async () => { await sequelize.sync({ force: true }); const book = await Book.create({ title: 'The Alchemist' }); console.log(book.toJSON()); })();
在执行上述代码时,由于我们没有为数据表创建一个 createdAt
字段,所以 Sequelize 就会抛出上述错误。
问题原因
在 Sequelize 中,每一个数据模型都继承一个名为 Model
的类。这个类中定义了一些默认字段,比如 createdAt
、 updatedAt
和 Id
。如果你没有在你的模型中定义这些字段,Sequelize 就会尝试查找这些默认字段,并在创建记录时使用它们。如果这些默认的字段在数据库中不存在,就会出现上述错误。
解决方案
要解决上述错误,我们需要在 Sequelize 中创建一个名为 createdAt
的字段。要实现这个目标,可以使用以下两种方式之一。
方案一:手动添加字段
首先,我们需要在我们的数据模型中添加一个名为 createdAt
的字段。例如:
// javascriptcn.com 代码示例 const sequelize = new Sequelize({ database: 'test', username: 'postgres', password: 'password', host: 'localhost', dialect: 'postgres', }); const Book = sequelize.define('book', { title: Sequelize.STRING, createdAt:{ type: Sequelize.DATE, allowNull: false, defaultValue: Sequelize.literal('NOW()'), } }); (async () => { await sequelize.sync({ force: true }); const book = await Book.create({ title: 'The Alchemist' }); console.log(book.toJSON()); })();
在这个代码示例中,我们手动添加了一个名为 createdAt
的字段,并指定了该字段的数据类型。除此之外,我们还为该字段设置了几个选项,例如允许 Null
、使用 NOW()
作为默认值等。
方案二:使用 timestamps
选项
Sequelize 提供了一个默认的选项,可以自动为数据表添加 createdAt
和 updatedAt
字段,这个选项名为 timestamps
。要使用这个选项,我们只需要将它设置为 true
。例如:
// javascriptcn.com 代码示例 const sequelize = new Sequelize({ database: 'test', username: 'postgres', password: 'password', host: 'localhost', dialect: 'postgres', }); const Book = sequelize.define('book', { title: Sequelize.STRING, }, { timestamps: true, }); (async () => { await sequelize.sync({ force: true }); const book = await Book.create({ title: 'The Alchemist' }); console.log(book.toJSON()); })();
在这个代码示例中,我们将 timestamps
选项设置为 true
,这将自动为数据表添加 createdAt
和 updatedAt
两个字段。
总结
在本文中,我们讨论了使用 Sequelize 操作 PostgreSQL 数据库时出现 “SequelizeDatabaseError: column "createdAt" does not exist” 错误的原因以及如何解决这个错误。我们介绍了手动添加 createdAt
字段和使用 timestamps
选项这两种解决方案,并提供了代码示例。为了获得最佳结果,请结合你的具体情况选择最佳方案。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652eb35c7d4982a6ebfc557a