【问题标题】:Sequelize sets ID field to null (non-sequential)Sequelize 将 ID 字段设置为 null(非顺序)
【发布时间】:2021-04-05 16:53:10
【问题描述】:

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

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

现在的问题是,如果我尝试使用 MyModel.create({name: "asdf"}) 创建新对象,Sequelize 将尝试更新插入包含设置为 null 的 id 字段的行。这类似于this StackOverflow question 中描述的问题,但那里提出的解决方案仅对顺序数字 ID 有效。我还阅读了一些建议,包括在 Sequelize 接口级别设置 omitNulls 字段,但在很多情况下我需要用 null 覆盖值,因此设置这样的全局配置对我来说不是一个可行的解决方案。

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

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

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 2021-12-30
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2018-05-24
      • 2012-05-09
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多