query-build
sql query build tootom,make native SQL and ORM will be mixed to write, complement each other.
install
npm install query-build
exmaple
import { QueryBuild, Op } from "query-build";
const queryBuild = new QueryBuild();
SELECT
queryBuild.merge(
'SELECT * FROM users WHERE',
queryBuild.where({name:'jack', age:20}),
'AND',
"(",
queryBuild.where({ vip: 1 }),
" OR ",
queryBuild.where({ group: "admin" }),
")",
'AND',queryBuild.where({
id:{[Op.in]:[1,2,3]}
}),
'AND',queryBuild.where({
type:{[Op.sqlBind]:{
sql:'type=1',
bind:[]
}}
}),
'GROUP BY order'
)
queryBuild.merge(
'SELECT * FROM users WHERE',
{
sql:'name = ? AND age = ?',
bind:['jack', 20]
}
'AND',
"(",
queryBuild.where({ vip: 1 }),
" OR ",
queryBuild.where({ group: "admin" }),
")",
'AND',queryBuild.where({
id:{[Op.in]:[1,2,3]}
}),
'AND',queryBuild.where({
type:{[Op.sqlBind]:{
sql:'type=1',
bind:[]
}}
}),
'GROUP BY order'
)
UPDATE
queryBuild.merge(
'UPDATE users SET',
queryBuild.set({name:'jack', age:20}),
'WHERE',
queryBuild.where({id:1, name:'tom'}),
)
queryBuild.merge(
'UPDATE users',
{
sql:'SET name = ?, age = ?',
bind:['jack', 20]
},
'WHERE',
queryBuild.where({id:1, name:'tom'}),
)
INSERT
queryBuild.merge(
'INSERT INTO users (age, name)',
'VALUES',
queryBuild.foreach(
[
{name:'jack',age:20},
{name:'tom',age:21},
{name:'jerry',age:22},
],
['age','name']
)
)
queryBuild.merge(
'INSERT INTO users (age, name)',
'VALUES',
{
sql:'(?, ?)',
bind:[20, 'jack']
},
queryBuild.foreach(
[
{name:'tom',age:21},
{name:'jerry',age:22},
],
['age','name']
)
)
DELETE
queryBuild.merge(
'DELETE FROM users',
'WHERE',
queryBuild.where({id:1, name:'jack'}),
'OR',queryBuild.where({name:'tom'}),
)
queryBuild.merge(
'DELETE FROM users',
'WHERE',
{
sql:'id = ? AND name = ?',
bind:[ 1, 'jack' ]
},
'OR',queryBuild.where({name:'tom'}),
)
AOP
const queryBuild = new Proxy(new QueryBuild(),{
get: function (target, propKey, receiver) {
if(propKey==='where'){
return (where,...params)=>{
where['platform_type'] = 1;
const sqlBind = Reflect.get(target, propKey, receiver)(where,...params);
sqlBind.sql+= 'AND deleted_timestamp IS NULL'
return sqlBind;
}
}
return Reflect.get(target, propKey, receiver);
}
})
queryBuild.merge(
'SELECT * FROM users WHERE',
queryBuild.where({name:'jack'}),
)
Core Api
export type SqlBind = {
sql: string;
bind: Array<any>;
};
export enum Op {
gt,
gte,
lt,
lte,
ne,
eq,
not,
between,
notBetween,
in,
notIn,
like,
notLike,
regexp,
notRegexp,
sqlBind,
}
export declare class QueryBuild {
where(where: Object): SqlBind;
orderBy(order: Array<[string, "asc" | "desc" | ""] | [string]>): SqlBind;
limit(limit: [number, number] | [number]): SqlBind;
set(prop: Object): SqlBind;
foreach(propList: Array<Object>, keys: Array<string>): SqlBind;
merge(...sqlBindList: Array<string | SqlBind>): SqlBind;
}
export default QueryBuild;