diff --git a/README.md b/README.md index 6b2d271..160123d 100644 --- a/README.md +++ b/README.md @@ -251,14 +251,20 @@ let rows = yield db.select('table-name'); ```js let rows = yield db.select('table-name', { where: { - type: 'javascript' + type: 'javascript', + name: { like: '%node%' }, + price: { lte: 50, gte:20 } }, columns: ['author', 'title'], orders: [['id', 'desc']] }); => SELECT `author`, `title` FROM `table-name` - WHERE `type` = 'javascript' ORDER BY `id` DESC + WHERE `type` = 'javascript' AND `name` LIKE + '%node%' AND `price` >= 20 AND `price` <= 50 + ORDER BY `id` DESC + + support:lte(<=)、gte(>=)、lt(<)、gt(>) ``` ### Delete diff --git a/lib/operator.js b/lib/operator.js index d0e451a..76a0013 100644 --- a/lib/operator.js +++ b/lib/operator.js @@ -8,6 +8,7 @@ const debug = require('debug')('ali-rds:operator'); const SqlString = require('./sqlstring'); const literals = require('./literals'); const wrap = require('co-wrap-all'); +const is = require('is-type-of'); module.exports = Operator; @@ -316,15 +317,27 @@ proto._where = function(where) { const value = where[key]; if (Array.isArray(value)) { wheres.push('?? IN (?)'); + values.push(key, value); + } else if (is.object(value) && !Array.isArray(value)) { + Object.keys(value).forEach(o => { + o = o.toLowerCase(); + ((o === 'like') && wheres.push('?? LIKE ?')) || + ((o === 'gte') && wheres.push('?? >= ?')) || + ((o === 'gt') && wheres.push('?? > ?')) || + ((o === 'lte') && wheres.push('?? <= ?')) || + ((o === 'lt') && wheres.push('?? < ?')); + + values.push(key, value[o] || value); + }); } else { if (value === null || value === undefined) { wheres.push('?? IS ?'); + values.push(key, value); } else { wheres.push('?? = ?'); + values.push(key, value); } } - values.push(key); - values.push(value); } if (wheres.length > 0) { return this.format(' WHERE ' + wheres.join(' AND '), values); diff --git a/package.json b/package.json index db01a22..b479573 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ali-rds", - "version": "3.3.1", + "version": "3.3.2", "description": "Aliyun RDS client", "main": "lib/client.js", "files": [ @@ -14,6 +14,7 @@ "dependencies": { "co-wrap-all": "^1.0.0", "debug": "^2.2.0", + "is-type-of": "^1.2.1", "mysql": "^2.13.0", "pify": "^2.3.0" }, diff --git a/test/operator.test.js b/test/operator.test.js index d39d00a..f0d7d8c 100644 --- a/test/operator.test.js +++ b/test/operator.test.js @@ -25,6 +25,9 @@ describe('operator.test.js', function() { assert.equal(op._where({ id: 1, name: 'foo\'\"' }), ' WHERE `id` = 1 AND `name` = \'foo\\\'\\\"\''); assert.equal(op._where({ id: 1, name: 'foo\'\"', user: 'fengmk2' }), ' WHERE `id` = 1 AND `name` = \'foo\\\'\\\"\' AND `user` = \'fengmk2\''); + assert.equal(op._where({ name: { like: '%fe%' }, sex: 1 }), ' WHERE `name` LIKE \'%fe%\' AND `sex` = 1'); + assert.equal(op._where({ time: { lte: '2019-10-10', gt: '2019-10-6' }, name: 'foo' }), ' WHERE `time` <= \'2019-10-10\' AND `time` > \'2019-10-6\' AND `name` = \'foo\''); + assert.equal(op._where({ name: { like: '%fe%' }, age: { lt: 20, gte: 18 }, address: 'beijing' }), ' WHERE `name` LIKE \'%fe%\' AND `age` < 20 AND `age` >= 18 AND `address` = \'beijing\''); }); });