{"id":20504505,"url":"https://github.com/candyframework/candyjs-db-mysql2","last_synced_at":"2026-04-19T11:36:08.579Z","repository":{"id":143736719,"uuid":"309331612","full_name":"candyframework/candyjs-db-mysql2","owner":"candyframework","description":"mysql 操作库","archived":false,"fork":false,"pushed_at":"2022-06-01T01:39:10.000Z","size":43,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-09-26T19:41:35.763Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/candyframework.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-11-02T10:12:35.000Z","updated_at":"2021-10-14T07:47:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"0e7efa4f-62b6-4da3-95e9-6283e64bb168","html_url":"https://github.com/candyframework/candyjs-db-mysql2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/candyframework/candyjs-db-mysql2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candyframework%2Fcandyjs-db-mysql2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candyframework%2Fcandyjs-db-mysql2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candyframework%2Fcandyjs-db-mysql2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candyframework%2Fcandyjs-db-mysql2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/candyframework","download_url":"https://codeload.github.com/candyframework/candyjs-db-mysql2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/candyframework%2Fcandyjs-db-mysql2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32005821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-11-15T19:38:27.963Z","updated_at":"2026-04-19T11:36:08.533Z","avatar_url":"https://github.com/candyframework.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## candyjs-db-mysql2\n\ndatabase interface\n\n## 使用说明\n\n+ [安装](#安装)\n\n+ [使用](#使用)\n\n    + 配置\n\n    + 使用 Command\n\n    + 使用 Query builder\n\n    + 使用 Transaction\n\n+ [配合 candyjs 使用](#配合 candyjs 使用)\n\n\n\n## 安装\n\n`@candyjs/db-mysql2` 依赖 `candyjs`，所以需要同时安装 `candyjs`\n\n\u003e 担心安装 `candyjs` 增加很多额外依赖？不必担心，`candyjs` 默认没有依赖其他第三方库文件\n\n```bash\n$ npm install candyjs\n$ npm install @candyjs/db-mysql2\n```\n\n\n\n## 使用\n\n#### 配置\n\n`@candyjs/db-mysql2` 使用主从架构操作数据库，按照一主多从进行数据库配置。\n\n\u003e 目前虽然可以实现主从配置，但是数据库 API 并不会自动进行主从切换，需要手动选择，具体用法参照使用章节。\n\n\n```javascript\nconst Db = require('@candyjs/db-mysql2');\n\nconst db = new Db({\n    // 主库配置\n    main: {\n        host: 'localhost',\n        port: 3306,\n        database: 'mydb',\n        user: '',\n        password: ''\n    },\n    // 多个从库配置\n    slaves: [\n        {\n            host: 'localhost',\n            port: 3306,\n            database: 'mydb_slave1',\n            user: '',\n            password: ''\n        }, {\n            host: 'localhost',\n            port: 3306,\n            database: 'mydb_slave2',\n            user: '',\n            password: ''\n        }\n    ]\n})\n```\n\n\n\n#### 使用 Command\n\nAPI 汇总\n\n```javascript\n// 准备 sql 语句\nprepareSql(sql: string): Command\n// 准备预处理 sql 语句\nprepareStatement(sql: string): Command\n// 为预处理 sql 赋值\nbindValues(arr: any[]): Command\n// 获取多条记录\nqueryAll(): Promise\u003cany\u003e\n// 获取单条记录\nqueryOne(): Promise\u003cany\u003e\n// 获取一列记录\nqueryColumn(): Promise\u003cany\u003e\n// 执行更新操作\nexecute(): Promise\u003cnumber\u003e\ngetLastSql(): string\n```\n\n一般情况下，应当使用从库进行读操作，使用主库进行写操作。\n\n```javascript\n// 获得一个从库链接\nconst comm = db.getSlave();\n\nlet data = null;\ntry {\n    data = await comm.prepareSql('select * from t_users where id=1').queryOne();\n} catch(e) {\n    // todo\n}\n\nconsole.log(data);\n```\n\n为了避免 sql 注入问题（ SQL injection attacks ），建议使用预处理语句\n\n```javascript\n// 获得一个从库链接\nconst comm = db.getSlave();\n\nlet data = null;\ntry {\n    data = await comm.prepareStatement('select * from t_users where id=?').bindValues([1]).queryOne();\n} catch(e) {\n    // todo\n}\n\nconsole.log(data);\n```\n\n使用主库进行修改操作\n\n```javascript\n// 获得一个主库链接\nconst comm = db.getMain();\n\nlet data = null;\ntry {\n    data = await comm.prepareStatement('update t_users set age=? where id=?').bindValues([20, 1]).execute();\n} catch(e) {\n    // todo\n}\n\nconsole.log(data);\n```\n\n\n\n#### 使用 Query builder\n\nQuery builder 是对 sql 语句的函数封装，它只能进行查询操作，无法进行修改操作\n\nAPI 汇总\n\n```javascript\ngetAll(): Promise\u003cany\u003e\ngetOne(): Promise\u003cany\u003e\ngetColumn(): Promise\u003cstring\u003e\ncount(column: string = '*'): Promise\u003cnumber\u003e\nselect(columns: string): Query\nfrom(table: string): Query\nwhere(condition: string, parameters: any[] = null): Query\ngroupBy(column: string): Query\nhaving(condition: string): Query\norderBy(columns: string): Query\nlimit(limit: string): Query\n```\n\n使用\n\n```javascript\nlet q = new Db.Query(command);\ntry {\n    let data1 = await q.select('*').from('user').where('id=1').getOne();\n    let data2 = await q.select('*').from('user').where('id=?', [2]).getOne();\n    let data3 = await q.from('user').count('id');\n} catch(e) {\n    // todo\n}\n```\n\n\u003e 注意：使用 query builder 时系统默认最大查询数量为 2333 条，可以通过 `Db.Query.MAX_LIMIT` 修改该值\n\u003e\n\n#### 使用 Transaction\n\n使用事务需要借助 `mysql2` 的原生 API，目前本库中对外可以获取经 promise 包装的 mysql2 api\n\n\n```\nconst db = new Db(someConfigs);\n\nconst internalDb = db.getMain().db;\nlet conn = null;\n\ntry {\n    conn = await internalDb.getConnection();\n    await conn.beginTransaction();\n\n    await conn.execute(sql1, params);\n    await conn.execute(sql2, params);\n\n    await conn.commit();\n\n} catch(e) {\n    conn \u0026\u0026 conn.rollback();\n}\n```\n\n## 配合 candyjs 使用\n\n```javascript\nconst CandyJs = require('candyjs');\nconst App = require('candyjs/web/Application');\nconst Db = require('@candyjs/db-mysql2');\n\nnew CandyJs(new App({\n    'id': 1,\n    'appPath': __dirname + '/app',\n    'db': new Db({\n        main: {\n            host: 'localhost',\n            port: 3306,\n            database: 'mydb',\n            user: '',\n            password: ''\n        },\n        slaves: [\n            {\n                host: 'localhost',\n                port: 3306,\n                database: 'mydb_slave1',\n                user: '',\n                password: ''\n            }, {\n                host: 'localhost',\n                port: 3306,\n                database: 'mydb_slave2',\n                user: '',\n                password: ''\n            }\n        ]\n    })\n})).listen(2333, function(){\n    console.log('listen on 2333');\n});\n\n\n\n// in some business\nconst Db = require('@candyjs/db-mysql2');\n\nmodule.exports = class IDao {\n    constructor() {\n        this.table = '';\n    }\n\n    /**\n     * 获取 mysql 链接\n     *\n     * @private\n     * @returns {Db}\n     */\n    getConnection() {\n        return Candy.app.db;\n    }\n\n    /**\n     * 统计表中记录数\n     */\n    async count(where = '1=1') {\n        const conn = this.getConnection();\n        const comm = conn.getSlave();\n\n        let num = 0;\n\n        try {\n            num = await comm.prepareSql(`SELECT count(*) as c FROM ${this.table} WHERE ${where}`).queryColumn();\n\n        } catch(err) {\n            CandyJs.getLogger().error(err.message);\n        }\n\n        return num;\n    }\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcandyframework%2Fcandyjs-db-mysql2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcandyframework%2Fcandyjs-db-mysql2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcandyframework%2Fcandyjs-db-mysql2/lists"}