[英]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.