【问题标题】:CHECK constraints in Seqeulize PostgreSQL ORM (Node.js)Seqeulize PostgreSQL ORM (Node.js) 中的检查约束
【发布时间】:2017-03-19 14:14:58
【问题描述】:

我将 Sequelize 用作带有 PostgreSQL 引擎的 ORM。使用原始查询时,我可以创建一个表并包含带有“CHECK”约束的列,例如

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

在文档中,我在定义模型时找不到在 Sequelize 中执行此操作的方法。有没有办法做到这一点?我不想重新发明轮子;)

谢谢!!

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:
    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');
        }
    };
    

    【讨论】:

    • 是否可以在模型定义中声明检查约束?
    【解决方案2】:

    看看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.
          }
        }
      }
    });
    

    【讨论】:

    • 我相信这只会在应用层强制执行价值。我不认为这实际上对桌子施加了约束。如果您正在使用 sequelize 迁移,则可以运行原始查询以自己插入约束。
    • 同意上面的评论。我正在寻找一种匹配强制同步和迁移的方法(强制同步用于 circle-ci 测试)。最终的解决方案是在 circle-ci 中使用迁移而不是 force-sync,速度稍慢但效果一样好。
    • 应用端验证!= 数据库约束
    猜你喜欢
    • 2016-11-13
    • 2023-03-20
    • 2013-04-25
    • 2011-07-09
    • 2020-02-12
    • 2012-04-04
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多