【问题标题】:Foreign key violations with SERIAL in Node.jsNode.js 中与 SERIAL 的外键冲突
【发布时间】:2017-06-22 07:25:13
【问题描述】:

在遵循 cockroachdb example 使用 node.js 的 sequelize orm 构建应用程序时,我对其进行了扩展以添加我的模型之间的关联。主键是 INT,通过 unique_rowid() 自动递增。根据您的文档,这是您对SERIAL 的实现。

同步我的模型后,我尝试使用以下代码创建记录:

models.sequelize.sync({ force: true })
  .then(function () {
    return models.Customer.create({
      name: "Sample Customer"
    })
  })
  .then(function (result) {
    const id = parseInt(result.dataValues.id, 10)
    return models.Order.bulkCreate([
      { subtotal: 100.00, customer_id: id },
      { subtotal: 200.00, customer_id: id }
    ])
  })

运行时,我得到“error: foreign key violation: value [255737842446434300] not found in customers@primary [id]

我意识到我的parseInt 似乎不具备获取从客户创建返回的字符串 id 所需的精度,但我不知道如何实现。

【问题讨论】:

    标签: node.js sequelize.js cockroachdb


    【解决方案1】:

    2017 年 7 月 6 日更新。

    sequelize-cockroachdb 的最新版本 v1.0.2 教导 Sequelize 将数字上下文中使用的字符串强制转换为 CockroachDB 整数。只是不要在result.dataValues.id 上调用parseInt,它应该可以按您的预期工作!

    models.sequelize.sync({ force: true })
      .then(function () {
        return models.Customer.create({
          name: "Sample Customer"
        })
      })
      .then(function (result) {
        return models.Order.bulkCreate([
          { subtotal: 100.00, customer_id: result.dataValues.id },
          { subtotal: 200.00, customer_id: result.dataValues.id }
        ])
      })
    

    正如您所发现的,问题在于 unique_rowid() 生成的 ID(如 255737842446434300)太大而无法放入 JavaScript Number 中,它只能精确表示最大为 2 的整数53 sup> - 1. 这个问题的通常解决方案是 改为使用字符串。也就是说,您可以简单地忽略对parseInt 的调用,并将{ ..., customer_id: "255737842446434300"} 直接传递给Order.bulkCreate

    不幸的是,Sequelize 随后会生成如下所示的 SQL 语句:

    INSERT INTO orders (customer_id) VALUES ('255737842446434300');
    

    PostgreSQL 很乐意将该字符串文字转换为 int8,但 CockroachDB 会抱怨在需要 int8 的地方使用字符串文字。我有开放的 PR 来修复 CockroachDB sideSequelize adapter side 上的这个问题,但都还没有登陆。不过,我们几乎肯定会有 v1.1 的解决方案!


    与此同时,特别是如果您想要一个与 CockroachDB v1.0 兼容的解决方案,您可以通过使用带有 Sequelize.BLOB 类型的 UUID 主键来解决此问题。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2018-07-26
      相关资源
      最近更新 更多