2017-06-22 33 views
1

cockroachdb example后面使用sequelize orm for node.js构建应用程序时,我扩展了它以添加模型之间的关联。主键是INT,通过unique_rowid()自动递增。根据您的文档,这是您的实施SERIAL在Node.js中使用SERIAL的外键违规

synching我的模型之后,我尝试使用下面的代码来创建记录:

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 [email protected] [id]

我意识到我parseInt不会出现有为了接受客户创建返回的字符串ID所需的精度,但我不知道如何完成此操作。

回答

2

更新,7月6日2017年

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 - 1.通常的解决方案是使用字符串代替 。也就是说,您可以简单地忽略parseInt的呼叫并将{ ..., customer_id: "255737842446434300"}直接传递给​​。

不幸的是,Sequelize然后将生成的SQL语句,看起来像这样:

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

PostgreSQL将字符串常量愉快地转换成int8,但CockroachDB会抱怨使用一个字符串文字,其中一个int8预期。我已经打开PR来解决此问题CockroachDB sideSequelize adapter side,但都没有登陆。然而,我们几乎肯定会有v1.1的解决方案!


在此期间,特别是如果你想与CockroachDB兼容的解决方案1.0版,您可以解决这个问题,通过使用UUID主键与Sequelize.BLOB类型。