{"id":18784831,"url":"https://github.com/zy445566/query-build","last_synced_at":"2025-04-13T12:33:26.876Z","repository":{"id":57332338,"uuid":"286967995","full_name":"zy445566/query-build","owner":"zy445566","description":"sql query build tools","archived":false,"fork":false,"pushed_at":"2024-11-26T07:52:39.000Z","size":39,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-27T03:41:34.343Z","etag":null,"topics":["build","mybatis","mysql","mysqli","query","sql"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zy445566.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-12T09:08:09.000Z","updated_at":"2024-11-26T07:52:43.000Z","dependencies_parsed_at":"2024-11-07T20:46:10.007Z","dependency_job_id":"22395e71-7b7c-4277-9f08-5f29453c222e","html_url":"https://github.com/zy445566/query-build","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zy445566%2Fquery-build","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zy445566%2Fquery-build/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zy445566%2Fquery-build/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zy445566%2Fquery-build/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zy445566","download_url":"https://codeload.github.com/zy445566/query-build/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248360123,"owners_count":21090654,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["build","mybatis","mysql","mysqli","query","sql"],"created_at":"2024-11-07T20:44:12.105Z","updated_at":"2025-04-13T12:33:26.620Z","avatar_url":"https://github.com/zy445566.png","language":"TypeScript","readme":"# query-build\n\nsql query build tootom，make native SQL and ORM will be mixed to write, complement each other.\n\n# install\n\n```sh\nnpm install query-build\n```\n\n# exmaple\n\n```ts\nimport { QueryBuild, Op } from \"query-build\";\n// const { QueryBuild, Op } = require('query-build');\nconst queryBuild = new QueryBuild();\n```\n\n### SELECT\n\n```ts\nqueryBuild.merge(\n    'SELECT * FROM users WHERE',\n    queryBuild.where({name:'jack', age:20}),\n    'AND',\n        \"(\",\n        queryBuild.where({ vip: 1 }),\n        \" OR \",\n        queryBuild.where({ group: \"admin\" }),\n        \")\",\n    'AND',queryBuild.where({\n        id:{[Op.in]:[1,2,3]}\n    }),\n    'AND',queryBuild.where({\n        type:{[Op.sqlBind]:{\n            sql:'type=1',\n            bind:[]\n        }}\n    }),\n    'GROUP BY order'\n)\n// OR use SqlBind Object mixed\nqueryBuild.merge(\n    'SELECT * FROM users WHERE',\n    {\n        sql:'name = ? AND age = ?',\n        bind:['jack', 20]\n    }\n    'AND',\n        \"(\",\n        queryBuild.where({ vip: 1 }),\n        \" OR \",\n        queryBuild.where({ group: \"admin\" }),\n        \")\",\n    'AND',queryBuild.where({\n        id:{[Op.in]:[1,2,3]}\n    }),\n    'AND',queryBuild.where({\n        type:{[Op.sqlBind]:{\n            sql:'type=1',\n            bind:[]\n        }}\n    }),\n    'GROUP BY order'\n)\n/**\noutput:\n{\n    sql: 'SELECT * FROM users WHERE name = ? AND age = ? AND ( vip = ? OR group = ? ) AND id IN (?, ?, ?) AND type=1 GROUP BY order',\n    bind: [ 'jack', 20, 1, 'admin', 1, 2, 3 ]\n}\n * /\n```\n\n### UPDATE\n\n```ts\nqueryBuild.merge(\n    'UPDATE users SET',\n    queryBuild.set({name:'jack', age:20}),\n    'WHERE',\n    queryBuild.where({id:1, name:'tom'}),\n)\n// OR use SqlBind Object mixed\nqueryBuild.merge(\n    'UPDATE users',\n    {\n        sql:'SET name = ?, age = ?',\n        bind:['jack', 20]\n    },\n    'WHERE',\n    queryBuild.where({id:1, name:'tom'}),\n)\n/**\noutput:\n{\n    sql: 'UPDATE users SET name = ?, age = ? WHERE id = ? AND name = ?',\n    bind: [ 'jack', 20, 1, 'tom' ]\n}\n * /\n```\n\n### INSERT\n\n```ts\nqueryBuild.merge(\n    'INSERT INTO users (age, name)',\n    'VALUES',\n    queryBuild.foreach(\n        [\n            {name:'jack',age:20},\n            {name:'tom',age:21},\n            {name:'jerry',age:22},\n        ],\n        ['age','name']\n    )\n)\n// OR use SqlBind Object mixed\nqueryBuild.merge(\n    'INSERT INTO users (age, name)',\n    'VALUES',\n    {\n        sql:'(?, ?)',\n        bind:[20, 'jack']\n    },\n    queryBuild.foreach(\n        [\n            {name:'tom',age:21},\n            {name:'jerry',age:22},\n        ],\n        ['age','name']\n    )\n)\n/**\noutput:\n{\n    sql: 'INSERT INTO users (age, name) VALUES (?, ?),(?, ?),(?, ?)',\n    bind: [ 20, 'jack', 21, 'tom', 22, 'jerry' ]\n}\n * /\n```\n\n### DELETE\n\n```ts\nqueryBuild.merge(\n    'DELETE FROM users',\n    'WHERE',\n    queryBuild.where({id:1, name:'jack'}),\n    'OR',queryBuild.where({name:'tom'}),\n)\n// OR use SqlBind Object mixed\nqueryBuild.merge(\n    'DELETE FROM users',\n    'WHERE',\n    {\n        sql:'id = ? AND name = ?',\n        bind:[ 1, 'jack' ]\n    },\n    'OR',queryBuild.where({name:'tom'}),\n)\n/**\noutput:\n{\n    sql: 'DELETE FROM users WHERE id = ? AND name = ? OR name = ?',\n    bind: [ 1, 'jack', 'tom' ]\n}\n * /\n```\n\n### AOP\n\n```js\nconst queryBuild = new Proxy(new QueryBuild(),{\n    get: function (target, propKey, receiver) {\n        if(propKey==='where'){\n            return (where,...params)=\u003e{\n                where['platform_type'] = 1;\n                const sqlBind = Reflect.get(target, propKey, receiver)(where,...params);\n                sqlBind.sql+= 'AND deleted_timestamp IS NULL'\n                return sqlBind;\n            }\n        }\n        return Reflect.get(target, propKey, receiver);\n    }\n})\nqueryBuild.merge(\n    'SELECT * FROM users WHERE',\n    queryBuild.where({name:'jack'}),\n)\n/**\noutput:\n{\n    sql: 'SELECT * FROM users WHERE name = ? AND platform_type = ? AND deleted_timestamp IS NULL',\n    bind: ['jack',1]\n}\n * /\n```\n\n# Core Api\n\n```ts\n// SqlBind is anywhere,mixed anywhere\nexport type SqlBind = {\n  sql: string;\n  bind: Array\u003cany\u003e;\n};\n\n// [Op.gt]: 6,                // \u003e 6\n// [Op.gte]: 6,               // \u003e= 6\n// [Op.lt]: 10,               // \u003c 10\n// [Op.lte]: 10,              // \u003c= 10\n// [Op.ne]: 20,               // != 20\n// [Op.eq]: 3,                // = 3\n// [Op.not]: true,            // IS NOT TRUE\n// [Op.between]: [6, 10],     // BETWEEN 6 AND 10\n// [Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15\n// [Op.in]: [1, 2],           // IN (1, 2)\n// [Op.notIn]: [1, 2],        // NOT IN (1, 2)\n// [Op.like]: '%hat',         // LIKE '%hat'\n// [Op.notLike]: '%hat'       // NOT LIKE '%hat'\n// [Op.regexp]: '^[h|a|t]'    // REGEXP/~ '^[h|a|t]' (MySQL/PG only)\n// [Op.notRegexp]: '^[h|a|t]' // NOT REGEXP/!~ '^[h|a|t]' (MySQL/PG only)\nexport enum Op {\n  gt, // \u003e 6\n  gte, // \u003e= 6\n  lt, // \u003c 10\n  lte, // \u003c= 10\n  ne, // != 20\n  eq, // = 3\n  not, // IS NOT TRUE\n  between, // BETWEEN 6 AND 10\n  notBetween, // NOT BETWEEN 11 AND 15\n  in, // IN (1, 2)\n  notIn, // NOT IN (1, 2)\n  like, // LIKE '%hat'\n  notLike, // NOT LIKE '%hat'\n  regexp, // REGEXP/~ '^[h|a|t]' (MySQL/PG only)\n  notRegexp, // NOT REGEXP/!~ '^[h|a|t]' (MySQL/PG only)\n  sqlBind, // use sqlBind native\n}\n\nexport declare class QueryBuild {\n  where(where: Object): SqlBind;\n  orderBy(order: Array\u003c[string, \"asc\" | \"desc\" | \"\"] | [string]\u003e): SqlBind;\n  limit(limit: [number, number] | [number]): SqlBind;\n  set(prop: Object): SqlBind;\n  foreach(propList: Array\u003cObject\u003e, keys: Array\u003cstring\u003e): SqlBind;\n  merge(...sqlBindList: Array\u003cstring | SqlBind\u003e): SqlBind;\n}\nexport default QueryBuild;\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzy445566%2Fquery-build","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzy445566%2Fquery-build","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzy445566%2Fquery-build/lists"}