2016-11-06 38 views
0

我使用Sequelize作爲ORM和PostgreSQL引擎。當使用原始查詢,我可以創建一個表,並與「檢查」約束的列如Seqeulize PostgreSQL中的CHECK約束ORM(Node.js)

CREATE TABLE products (
    product_no integer, 
    name text, 
    price numeric CHECK (price > 0) 
); 

在文檔,我不能找到一種方法Sequelize定義模型時,要做到這一點。有沒有辦法做到這一點?我不想重新發明車輪;)

謝謝!

回答

0

看看Validations section

var Product = sequelize.define('product', { 
    price: { 
    validate: { 
     min: 0 // Only allow values >= 0 
    } 
    } 
}); 

您還可以設置自定義的驗證規則:

var Product = sequelize.define('product', { 
    price: { 
    validate: { 
     isPositive: function (value) { 
     return value > 0; // Don't allow 0. 
     } 
    } 
    } 
}); 
+0

我相信這只是在強制執行應用層的價值。我不認爲這實際上對桌子施加了限制。如果您使用集合遷移,則可以運行原始查詢來自行插入約束。 – thgaskell

+0

同意上面的評論。我正在尋找一種方法來匹配強制同步和遷移(force-sync用於circle-ci測試)。 最終的解決方案是使用遷移,而不是在circle-ci中進行強制同步,雖然速度稍慢,但工作情況同樣不錯。 –

0
module.exports = { 

    up: (queryInterface, Sequelize) => { 

     return queryInterface.createTable('Products', { 
      product_no: { 
       type: Sequelize.INTEGER 
      }, 
      price: { 
       type: Sequelize.NUMERIC 
      }, 
      name: { 
       type: Sequelize.TEXT 
      } 
     }). 

     then(() => queryInterface.addConstraint('Products', ['price'], { 
      type: 'check', 
      where: { 
       price: { 
        [Sequelize.Op.gt]: 0 
       } 
      } 
     })); 
    }, 

    down: (queryInterface, Sequelize) => { 
     return queryInterface.dropTable('Products'); 
    } 
};