2017-06-22 3 views
1

cockroachdb exampleのnode.jsにsequelize ormを使用してアプリケーションを構築した後、私はそれを拡張してモデル間の関連付けを追加しました。主キーは、unique_rowid()による自動インクリメントのINTです。ドキュメントに基づいて、これはSERIALの実装です。Node.jsの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 [email protected] [id]

を取得し、私は私のparseIntを持っているように見えていません実現します顧客作成から返された文字列idを取得するために必要な精度ですが、これをどのように達成するかわかりません。

答えて

2

アップデート、2017年7月6日

sequelize-cockroachdb、1.0.2の最新バージョンは、CockroachDBの整数に数値コンテキストで使用される文字列を強制するためにSequelizeを教えています。単にparseIntresult.dataValues.idに電話しないでください。期待通りに機能するはずです。だけ正確に2 までの整数を表すことができ

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

問題、あなたが発見したとして、255737842446434300のようなunique_rowid()によって生成されたIDは、JavaScript Numberに収まるには大きすぎるということです、この問題の通常の解決方法は、代わりに文字列を使用する です。つまり、parseIntへの呼び出しを省略し、{ ..., customer_id: "255737842446434300"}を​​に直接渡すことができます。

残念ながら、Sequelizeは、このように見えるSQL文を生成します。

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

PostgreSQLは喜んint8にその文字列リテラルに変換しますが、CockroachDBはint8が期待されている文字列リテラルを使用して文句を言うだろう。 CockroachDB sideまたはSequelize adapter sideのいずれかでこれを修正する公開PRがありますが、いずれもまだ着手していません。しかし、v1.1のソリューションはほぼ確実に提供されます。この間、特に中


あなたはCockroachDB v1.0を - あなたはSequelize.BLOBタイプでUUID主キーを使用することによって問題を回避できると互換性の解決をしたい場合。

関連する問題