{"id":19689891,"url":"https://github.com/axiosleo/node-orm-mysql","last_synced_at":"2025-06-22T19:08:17.603Z","repository":{"id":47345491,"uuid":"515413820","full_name":"AxiosLeo/node-orm-mysql","owner":"AxiosLeo","description":"MySQL ORM tool","archived":false,"fork":false,"pushed_at":"2025-04-23T02:30:52.000Z","size":266,"stargazers_count":5,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-22T19:07:46.073Z","etag":null,"topics":["database","mysql","nodejs","orm","sql"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/AxiosLeo.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,"zenodo":null}},"created_at":"2022-07-19T02:56:21.000Z","updated_at":"2025-04-23T02:30:55.000Z","dependencies_parsed_at":"2023-12-10T09:27:07.691Z","dependency_job_id":"71756ecf-b7a1-4617-bcb3-58867e98e939","html_url":"https://github.com/AxiosLeo/node-orm-mysql","commit_stats":{"total_commits":325,"total_committers":5,"mean_commits":65.0,"dds":0.01538461538461533,"last_synced_commit":"4774878a0d85fe16ffef2b0936f3e7099a0d2b4d"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AxiosLeo/node-orm-mysql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxiosLeo%2Fnode-orm-mysql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxiosLeo%2Fnode-orm-mysql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxiosLeo%2Fnode-orm-mysql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxiosLeo%2Fnode-orm-mysql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AxiosLeo","download_url":"https://codeload.github.com/AxiosLeo/node-orm-mysql/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AxiosLeo%2Fnode-orm-mysql/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261348751,"owners_count":23145313,"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":["database","mysql","nodejs","orm","sql"],"created_at":"2024-11-11T19:03:33.254Z","updated_at":"2025-06-22T19:08:12.589Z","avatar_url":"https://github.com/AxiosLeo.png","language":"JavaScript","readme":"# @axiosleo/orm-mysql\n\n\n[![NPM version](https://img.shields.io/npm/v/@axiosleo/orm-mysql.svg?style=flat-square)](https://npmjs.org/package/@axiosleo/orm-mysql)\n[![npm download](https://img.shields.io/npm/dm/@axiosleo/orm-mysql.svg?style=flat-square)](https://npmjs.org/package/@axiosleo/orm-mysql)\n[![node version](https://img.shields.io/badge/node.js-%3E=_16.0-green.svg?style=flat-square)](http://nodejs.org/download/)\n[![License](https://img.shields.io/github/license/AxiosLeo/node-orm-mysql?color=%234bc524)](LICENSE)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAxiosLeo%2Fnode-orm-mysql.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FAxiosLeo%2Fnode-orm-mysql?ref=badge_shield)\n\n## Installation\n\n```bash\nnpm install @axiosleo/orm-mysql\n```\n\n## Usage\n\n### Create MySQL client\n\n```javascript\nconst { createClient } = require(\"@axiosleo/orm-mysql\");\n\nconst client = createClient({\n  host: process.env.MYSQL_HOST,\n  port: process.env.MYSQL_PORT,\n  user: process.env.MYSQL_USER,\n  password: process.env.MYSQL_PASS,\n  database: process.env.MYSQL_DB,\n});\n```\n\n### Initialize database handler\n\n```javascript\nconst { QueryHandler } = require(\"@axiosleo/orm-mysql\");\n\nconst db = new QueryHandler(client);\n```\n\n### Initialize query\n\n```javascript\nconst query = db.table('\u003ctable-name\u003e');\n\nquery.attr(\"id\", \"name\", \"age\"); // set attributes\nquery.where(\"name\", \"Joe\");      // set where condition\nquery.orWhere(\"age\", \"\u003e\", 18);   // set or where condition\nquery.andWhere(\"age\", \"\u003c\", 30);  // set and where condition\nquery.orderBy(\"age\", \"desc\");    // set order by\nquery.limit(10);                 // set limit\nquery.offset(0);                 // set offset\n\nlet rows = await query.select(); // select\n```\n\n### Some Query Examples\n\n```javascript\nconst { createClient, QueryHandler, Query } = require(\"@axiosleo/orm-mysql\");\n\nconst conn = createClient({\n  host: process.env.MYSQL_HOST,\n  port: process.env.MYSQL_PORT,\n  user: process.env.MYSQL_USER,\n  password: process.env.MYSQL_PASS,\n  database: process.env.MYSQL_DB,\n});\n\nconst hanlder = new QueryHandler(conn);\n\nasync function selectExample() {\n  const query = handler.table(\"users\"); // init QueryOperator by table name\n\n  query.attr(\"id\", \"name\", \"age\"); // set attributes\n  query.where(\"name\", \"Joe\");      // set where condition\n  query.orWhere(\"age\", \"\u003e\", 18);   // set or where condition\n  query.andWhere(\"age\", \"\u003c\", 30);  // set and where condition\n  query.orderBy(\"age\", \"desc\");    // set order by\n  query.limit(10);                 // set limit\n  query.offset(0);                 // set offset\n\n  let rows = await query.select(); // select\n}\n\nasync function findExample() {\n  const query = handler.table(\"users\"); // init QueryOperator by table name\n\n  query.attr(\"id\", \"name\", \"age\");      // set attributes\n  query.where(\"name\", \"Joe\");           // set where condition\n  query.orWhere(\"age\", \"\u003e\", 18);        // set or where condition\n  query.andWhere(\"age\", \"\u003c\", 30);       // set and where condition\n  query.orderBy(\"age\", \"desc\");         // set order by\n  // query.limit(10);                   // not supported set limit\n  // query.offset(10);                  // not supported set offset\n\n  let row = await query.find();         // find single row\n}\n\nasync function insertExample() {\n  const query = handler.table(\"users\");\n\n  // insert\n  let row = await query.insert({\n    name: \"Joe\",\n    age: 18,\n  });\n\n  // The insert operation will be changed to the update operation if the uuid already exists\n  row = await query.keys('uuid').insert({\n    uuid: 'uuid-string', // uuid is unique index\n    name: \"Joe\",\n    age: 18,\n  })\n}\n\nasync function updateExample() {\n  const query = handler.table(\"users\");\n\n  // update\n  let row = await query.where(\"name\", \"Joe\").update({\n    name: \"Joe\",\n    age: 18,\n  });\n\n  // incrBy with number\n  row = await query.where(\"name\", \"Joe\").incrBy(\"age\", 1);\n\n  // incrBy with string\n  row = await query.where(\"name\", \"Joe\").incrBy(\"age\", \"1\");\n\n  // incrBy with Callback\n  let result = { status: \"success\" };\n  row = await query.where(\"id\", 1).incrBy(\"error_times\", () =\u003e {\n    // increase error_times if result.status is not success\n    if (result.status !== \"success\") {\n      return 1;\n    }\n    return 0;\n  });\n}\n\nasync function deleteExample() {\n  const query = handler.table(\"users\");\n\n  // delete with conditions\n  let result = await query.where(\"name\", \"Joe\").delete();\n\n  // delete by id\n  result = await query.delete(1);\n}\n\nasync function subqueryExample() {\n  const query = handler.table(\"users\", \"u\");\n  const subQuery = new Query(\"select\");\n  subQuery.table(\"users\").having(\"COUNT(*)\", \"\u003e\", 1);\n\n  const sql = query.where(\"u.name\", subQuery, \"IN\").buildSql(\"select\").sql;\n  // SELECT * FROM `users` AS `u` WHERE `u`.`name` IN (SELECT * FROM `users` GROUP BY `u`.`name` HAVING COUNT(*) \u003e ?)\n}\n```\n\n### Hook\n\n```javascript\nconst { Hook } = require(\"@axiosleo/orm-mysql\");\n\n// opt: 'select' | 'find' | 'insert' | 'update' | 'delete' | 'count'\n\nHook.pre(async (options) =\u003e {\n  debug.log('options', options);\n}, { table: 'table_name', opt: 'insert'});\n\nHook.post(async (options, result) =\u003e {\n  throw new Error('some error');\n}, { table: 'table_name', opt: 'insert' });\n```\n\n### Transaction\n\n```javascript\nconst { TransactionHandler, createPromiseClient } = require(\"@axiosleo/orm-mysql\");\n\nconst conn = await createPromiseClient({\n  host: process.env.MYSQL_HOST,\n  port: process.env.MYSQL_PORT,\n  user: process.env.MYSQL_USER,\n  password: process.env.MYSQL_PASS,\n  database: process.env.MYSQL_DB,\n});\n\nconst transaction = new TransactionHandler(conn, {\n  /*\n  level = 'READ UNCOMMITTED' | 'RU'\n        | 'READ COMMITTED' | 'RC'\n        | 'REPEATABLE READ' | 'RR'\n        | 'SERIALIZABLE' | 'S'\n  */\n  level: \"SERIALIZABLE\", // 'SERIALIZABLE' as default value\n});\nawait transaction.begin();\n\ntry {\n  // insert user info\n  // will not really create a record.\n  let row = await transaction.table(\"users\").insert({\n    name: \"Joe\",\n    age: 18,\n  });\n  const lastInsertId = row[0].insertId;\n\n  // insert student info\n  await transaction.table(\"students\").insert({\n    user_id: lastInsertId,\n  });\n  await transaction.commit();\n} catch (e) {\n  await transaction.rollback();\n  throw e;\n}\n```\n\n### Migration\n\n\u003e [Migration examples](./examples/migration/).\n\n- Migration script example\n\n```javascript\n'use strict';\n\n/**\n * @param {import('@axiosleo/orm-mysql').MigrationInterface} migration\n */\nfunction up(migration) {\n  migration.createTable('table1', {\n    field1: {\n      type: 'varchar',\n      length: 64,\n      allowNull: false,\n      uniqIndex: true\n    },\n    field2: {\n      type: 'VARCHAR',\n      allowNull: false\n    },\n    field3: {\n      type: 'VARCHAR',\n      comment: 'comment',\n      allowNull: false\n    },\n  });\n}\n\n/**\n * @param {import('@axiosleo/orm-mysql').MigrationInterface} migration\n */\nfunction down(migration) {\n  migration.dropTable('table1');\n}\n\nmodule.exports = {\n  up,\n  down\n};\n```\n\n- Generate migration script\n\n```bash\norm-mysql generate -h\n\nUsage:\n\n  generate [--] [name] \u003cdir\u003e\n  gen\n\nArguments:\n\n *name    Migration name\n  dir     Migration scripts directory\n```\n\n- Run migration\n\n```bash\norm-mysql migrate -h\n\nDescription:\n\n  Migrate database\n\nUsage:\n\n  migrate [options] [--] [action] \u003cdir\u003e\n\nOptions:\n\n  -d, --debug    [false] debug mode\n  --host         [localhost] mysql host\n  --port         [3306] port number to connect to the database\n  --user         [root] username for connect to the database\n  --pass         password to connect to the database\n  --db           database name\n\nArguments:\n\n *action         up or down\n  dir            migration directory\n```\n\n### Custom query driver\n\n```javascript\nconst { \n  createClient, \n  QueryHandler, \n  Query,\n  Builder \n} = require(\"@axiosleo/orm-mysql\");\n\nconst conn = createClient({\n  host: process.env.MYSQL_HOST,\n  port: process.env.MYSQL_PORT,\n  user: process.env.MYSQL_USER,\n  password: process.env.MYSQL_PASS,\n  database: process.env.MYSQL_DB,\n});\n\nconst hanlder = new QueryHandler(conn, {\n  driver: 'custom',\n  queryHandler: (con, options) =\u003e {\n    const builder = new Builder(options);\n    return new Promise((resolve, reject) =\u003e {\n      if (options.operator === 'select') {\n        resolve([{ a: 1, b: 2 }]);\n      } else {\n        reject(new Error('some error'));\n      }\n    });\n  }\n});\n```\n\n## License\n\nThis project is open-sourced software licensed under [MIT](LICENSE).\n\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAxiosLeo%2Fnode-orm-mysql.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FAxiosLeo%2Fnode-orm-mysql?ref=badge_large)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxiosleo%2Fnode-orm-mysql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxiosleo%2Fnode-orm-mysql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxiosleo%2Fnode-orm-mysql/lists"}