nodejs的查询构造器,QQ群里的一个哥们(路人某)给的一个类,感觉挺好的,分享出来
我使用的是express框架,类放在项目下的 /plugin/query.js中
/**
* Created by Administrator on 2014/5/9.
*/
var mootools = require('mootools');
function QueryElement(name, elements, glue){
this.elements = [];
this.type = "";
this.name = name;
this.glue = glue || ',';
this.appends(elements);
};
QueryElement.prototype.appends = function(elements){
if (typeof elements == 'array') {
this.elements.append(elements);
} else {
this.elements.append(new Array(elements));
}
};
QueryElement.prototype.toString = function(){
if(this.name.substr(-2) == '()'){
return this.name.substr(0,-2)+"("+this.elements.join(this.glue)+")";
} else{
return this.name+" "+this.elements.join(this.glue)+" ";
}
};
QueryElement.prototype.getElement = function(){
return this.elements;
};
function Query(){
this.type = null;
this.froms = null;
this.groups = null;
this.havings = null;
this.orders = null;
this.elements = null;
this.selects = null;
this.deletes = null;
this.updates = null;
this.inserts = null;
this.joins = null;
this.sets = null;
this.wheres = null;
this.columnss = null;
this.valuess = null;
this.limits = null;
this.autoIncrementField = null;
};
/**
* query.from('table')
* @param tables
* @returns {Query}
*/
Query.prototype.from = function(tables){
this.froms = new QueryElement('FROM',tables).toString();
return this;
};
/**
*
* @param columns
* @returns {Query}
*/
Query.prototype.group = function(columns){
this.groups = new QueryElement('GROUP BY',columns).toString();
return this;
};
Query.prototype.having = function(conditions,glue){
glue = glue || 'AND';
this.havings = new QueryElement('HAVING',conditions," "+glue+" ").toString();
return this;
};
Query.prototype.innerJoin = function (condition){
this.join('INNER',condition);
return this;
};
Query.prototype.leftJoin = function (condition){
this.join('LEFT',condition);
return this;
};
Query.prototype.join = function(type,condition){
if(this.joins == null){
this.joins = [];
}
this.joins.append(new Array(new QueryElement(type.toLocaleUpperCase()+'JOIN',condition).toString()));
return this;
};
Query.prototype.insert = function(table,autoIncrementField){
this.type = 'INSERT';
this.inserts = new QueryElement('INSERT INTO ',table).toString();
this.autoIncrementField = autoIncrementField || false;
return this;
};
Query.prototype.length = function(value){
return 'LENGTH('+ value +')';
return this;
};
Query.prototype.order = function (columns){
this.orders = new QueryElement('ORDER BY ',columns).toString();
return this;
};
Query.prototype.outerJoin = function (conditions){
this.join('OUTER',condtions);
return this;
};
Query.prototype.rightJoin = function (conditions){
this.join('right',condtions);
return this;
};
/**
*
* eq:
* query.select('a.*').select('b.id');
* query.select(['a.*', 'b.id']);
*
* @param columns
* @returns {Query}
*/
Query.prototype.select = function (columns){
this.type='SELECT';
this.selects = new QueryElement('SELECT',columns+"").toString();
return this;
};
/**
* eq:
* query.set("a = 1").set('b=2');
* qyert.set([a:1,b:2]);
* @param columns
* @param glue
* @returns {Query}
*/
Query.prototype.set = function (columns,glue){
glue = glue || ','
this.sets = new QueryElement('VALUES',columns," "+glue+" ").toString();
return this;
};
/**
* eq;
* query.update('table')->set('a=1');
* @param table
* @returns {Query}
*/
Query.prototype.update = function (table){
this.type = 'update';
this.updates = new QueryElement('UPDATE',table).toString();
return this;
};
/**
* eq:
* query.values('1,123,3').values('2,2,3,4');
* query.values([[1,2,3],[2,3,3]])
* @param values
* @returns {Query}
*/
Query.prototype.values = function (values){
this.valuess = new QueryElement('()',values,'),(').toString();
return this;
};
/**
* eq :
* query.where('a=b').where("b=a");
* query.where(['a=b','b=a']);
* @param conditions
* @param glue
* @returns {Query}
*/
Query.prototype.where = function(conditions,glue){
glue = glue || 'AND';
glue = glue.toLocaleUpperCase();
this.wheres = new QueryElement('WHERE',conditions," "+glue+" ").toString();
return this;
};
/**;
*
* query.delete('#__a').where('id = 1');
* @param table
* @returns {Query}
*/
Query.prototype.delete = function(table){
this.type = 'delete';
this.deletes = new QueryElement('DELETE',null).toString();
if(table){
this.from(table);
}
return this;
};
Query.prototype.columns = function(columns){
this.columnss = new QueryElement('()',columns).toString();
return this;
};
Query.prototype.limit = function(columns){
this.limits = new QueryElement('LIMIT',columns).toString();
return this;
}
Query.prototype.toString = function(){
var query = '';
var t = this.type.toLocaleLowerCase();
switch (t){
case 'element' :
query += this.elements;
break;
case 'select' :
query += this.selects;
query += this.froms;
if(this.joins){
this.joins.each(function(val){
query += val;
})
}
if(this.wheres){
query +=this.wheres;
}
if(this.havings){
console.log(this.havings);
query += this.havings;
}
if(this.groups){
query += this.groups;
}
if(this.orders){
query += this.orders;
}
if(this.limits){
query +=this.limits;
} else{
query += ' LIMIT 1';
}
break;
case 'delete' :
query += this.deletes;
query += this.froms;
if(this.joins){
this.joins.each(function(val){
query += val;
})
}
if(this.wheres){
query +=this.wheres;
}
if(this.limits){
query +=this.limits;
}
break;
case 'update' :
query += this.updates;
if(this.joins){
this.joins.each(function(val){
query += val;
})
}
query += this.sets;
if(this.wheres){
query +=this.wheres;
}
if(this.limits){
query +=this.limits;
}
break;
case 'insert' :
query += this.inserts;
// Set method
if (this.sets) {
query = this.sets;
} else if (this.valuess) {
if (this.columnss) {
query +=this.columnss;
}
query += ' VALUES ';
query += this.valuess;
}
break;
}
return query;
};
module.exports = Query;
var query = require("../plugin/query.js");
var M = new query();
var sql = M.delete('tabname').where('id = 1').toString();
console.log(sql);//DELETE FROM tabname WHERE id = 1