Sequelize将ID字段设置为null(非连续)



我在Postgres 12.4中使用Sequelize,我更喜欢使用UUID而不是顺序ID,尽管这总是会让任何ORM头疼。我以前使用beforeCreate钩子来设置随机UUID,但如果你需要做upstart,这种方法会变得非常复杂,我会这样做,所以我试图让Postgres为我生成UUID

id: { type: Sequelize.UUID, primaryKey: true, defaultValue: Sequelize.literal('gen_random_uuid()') },

现在的问题是,如果我尝试使用MyModel.create({name: "asdf"})创建一个新对象,Sequelize将尝试追加一行,该行包括设置为null的id字段。这与StackOverflow问题中描述的问题类似,但这里提供的解决方案仅对顺序数字ID有效。我也读过一些建议,包括在Sequelize接口级别设置omitNulls字段,但在许多情况下,我需要用null覆盖值,所以设置这样的全局配置对我来说不是一个可行的解决方案

我曾尝试在现场级别设置此配置,但Sequelize今天似乎不支持此配置。另一个名称可能有类似的选项,但Sequelize API引用实际上似乎没有包含任何关于属性定义中可能包含的字段的最终文档-它只是说它可以是字符串或对象,没有进一步的规范,所以我只能参考可用的示例,这些示例似乎没有显示任何此类内容。

是否有任何方法可以指示Sequelize我的主键字段将由数据库管理,并且不应该设置,而不告诉Sequelize该字段是数字和顺序的?

我有一个变通方法,但它依赖于我自己设置的一些特性,所以我将不选择它,看看是否有人有更好的选择。

在我的特定情况下,我利用Sequelize CLI来管理数据库迁移,这意味着每个表(至少(在两个地方定义——由我的代码在运行时加载的最终模型定义,以及用于在部署时创建表的一个或多个迁移。我的解决方案只是让两个表定义以可控的方式不同。在我的迁移中,我完全使用上面列出的列定义,在我的模型类定义中,我使用以下内容:

id: { type: DataTypes.UUID, primaryKey: true, autoIncrement: true },

通过这种方式,autoIncrement字段不存在于创建的表中,并且仅用于在运行时修改库的行为。这很有效,但可能无法移植到其他人的设置中,而且(更重要的是(它可能会产生我不知道的副作用,因为我在API合同的边界之外工作。

最新更新