簡體   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