繁体   English   中英

Node.js中的SERIAL违反外键

[英]Foreign key violations with SERIAL in Node.js

在遵循关于使用node.js的续集 orm构建应用程序的cockroachdb示例时 ,我对其进行了扩展以在模型之间添加关联。 主键是通过unique_rowid()自动递增的INT。 根据您的文档,这是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所需的精度,但是我不知道该如何完成。

更新,2017年7月6日。

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

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 }
    ])
  })

这个问题,因为你已经发现,是一种通过生成的ID unique_rowid()像255737842446434300,太大而不能在JavaScript的号码 ,它只能完全代表整数多达2 53 - 1。通常解决这个问题是使用字符串代替。 也就是说,您可以简单地取消对parseInt的调用,并将{ ..., customer_id: "255737842446434300"}直接传递给Order.bulkCreate

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

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

PostgreSQL会很乐意将该字符串文字转换为int8 ,但是CockroachDB会抱怨在期望int8地方使用字符串文字。 我有开放的PR可以在CockroachDB端Sequelize适配器端解决此问题,但是都没有登陆。 我们几乎肯定会为v1.1提供解决方案!


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM