node.js - Sequelize 将 ID 字段设置为 null(非顺序)

标签 node.js sequelize.js

我将 Sequelize 与 Postgres 12.4 一起使用,我更喜欢使用 UUID 而不是顺序 ID,尽管这总是会导致任何 ORM 头痛。我以前通过使用设置随机 UUID 的 beforeCreate 钩子(Hook)来完成这项工作,但是如果您需要执行 upserts,这种方法会变得非常复杂,我会这样做,所以我试图让 Postgres 为我生成 UUID。我现在使用以下 sequelize 属性定义进行此工作:

      id: { type: Sequelize.UUID, primaryKey: true, defaultValue: Sequelize.literal('gen_random_uuid()') },
现在的问题是,如果我尝试使用 MyModel.create({name: "asdf"}) 创建一个新对象, Sequelize 将尝试更新包含 id 的行字段设置为空。这类似于 this StackOverflow question 中描述的问题。 ,但那里提出的解决方案仅对顺序数字 ID 有效。我还阅读了一些建议,包括设置 omitNulls Sequelize 接口(interface)级别的字段,但是在很多情况下我需要用 null 覆盖值,因此设置这样的全局配置对我来说不是一个可行的解决方案。
我尝试在字段级别设置此配置,但 Sequelize 今天似乎不支持此配置。可能有另一个名称的类似选项,但 Sequelize API 引用实际上似乎没有包含任何可以包含在属性定义中的可能字段的明确文档 - 它只是说它可以是字符串或对象,没有进一步的说明,所以我只能通过可用的示例进行,这些示例似乎没有显示任何类似的内容。
有什么方法可以指示 Sequelize 我的主键字段将由数据库管理并且永远不应该设置,而不告诉 Sequelize 该字段是数字和顺序的?

最佳答案

我有一些解决方法,但它依赖于我自己设置的一些特性,所以我将不选择它,看看是否有人有更好的选择。
在我的特殊情况下,我利用 Sequelize CLI 来管理数据库迁移,这意味着每个表都在(至少)两个地方定义——我的代码在运行时加载的最终模型定义,以及一个或多个迁移用于在部署时创建表。我的解决方案只是让两个表定义以受控方式不同。在我的迁移中,我完全使用上面列出的列定义,在我的模型类定义中,我使用以下内容:

    id: { type: DataTypes.UUID, primaryKey: true, autoIncrement: true },
这样,autoIncrement字段在创建表时不存在,仅用于在运行时修改库的行为。这可行,但可能无法移植到其他人的设置中,而且(更重要的是)它可能有我不知道的副作用,因为我在 API 契约(Contract)的边界之外工作。

关于node.js - Sequelize 将 ID 字段设置为 null(非顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65485722/

相关文章:

javascript - Grunt + Concat + Angularjs

javascript - Node.js 文档未定义

node.js - 当覆盖下划线字段时,Sequelize 不会清理 dataValues

node.js - 创建 Sequelize 关系/关联

node.js - Heroku - 当应用程序为 "asleep"时,CRON 作业是否继续工作?

node.js - 从 VS Code 将 NodeJS 应用部署到 Azure

node.js - 机器人框架 : Multi step waterfall

node.js - 如何在 sequelize 中选择一个值作为列

javascript - 我的 Sequelize 关联有困难

sql-server - 排除关联的 id 列