{"id":19989970,"url":"https://github.com/waitaction/websql-orm","last_synced_at":"2025-07-13T12:13:54.607Z","repository":{"id":65520216,"uuid":"85848479","full_name":"waitaction/websql-orm","owner":"waitaction","description":"websql-orm is a sqlite orm .  websql-orm library for cordova platform, typescript, angular and ionic .","archived":false,"fork":false,"pushed_at":"2023-10-28T02:15:41.000Z","size":626,"stargazers_count":46,"open_issues_count":1,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-28T12:51:17.611Z","etag":null,"topics":["angular","cordova","cordova-plugin","ionic","sqlite","typescript","websql","websql-orm"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/waitaction.png","metadata":{"files":{"readme":"README-CN.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":"2017-03-22T16:02:44.000Z","updated_at":"2024-05-12T20:38:56.000Z","dependencies_parsed_at":"2024-11-13T04:51:04.333Z","dependency_job_id":"32964f78-b49f-4d96-bcd0-4fca9f5aeea9","html_url":"https://github.com/waitaction/websql-orm","commit_stats":{"total_commits":103,"total_committers":3,"mean_commits":"34.333333333333336","dds":0.2038834951456311,"last_synced_commit":"31f53d9827ec95fadba8b9e9e320e328c1ca9721"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waitaction%2Fwebsql-orm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waitaction%2Fwebsql-orm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waitaction%2Fwebsql-orm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waitaction%2Fwebsql-orm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/waitaction","download_url":"https://codeload.github.com/waitaction/websql-orm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248986309,"owners_count":21194025,"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":["angular","cordova","cordova-plugin","ionic","sqlite","typescript","websql","websql-orm"],"created_at":"2024-11-13T04:50:52.024Z","updated_at":"2025-04-15T01:01:22.472Z","avatar_url":"https://github.com/waitaction.png","language":"TypeScript","readme":"\n# 介绍\n\n`websql-orm` 框架，支持 `typescript` `angular` `cordova` `ionic` `chrome` 的sqlite数据库读写。\n\n[![npm](https://badgen.net/npm/v/websql-orm)](https://www.npmjs.com/package/websql-orm)\n[![install size](https://badgen.net/packagephobia/install/websql-orm)](https://packagephobia.now.sh/result?p=websql-orm)\n[![downloads](https://badgen.net/npm/dt/websql-orm)](https://www.npmjs.com/package/websql-orm)\n\n[English Document](README.md)\n\n## 开始\n\n`websql-orm` 使用 `TypeScript` 语言编写，使用之前需在 `tsconfig.json` 添加装饰器配置项以启用装饰器特性.\n\n``` json\n{\n    \"compilerOptions\": {\n        \"experimentalDecorators\": true\n    }\n}\n```\n\n## 安装\n\n`npm install websql-orm@latest`\n\u003e提示：不要安装2.1.0之前的版本，2.1.0之前的版本是调试阶段的版本，无法使用\n\n`cordova plugin add cordova-sqlite-storage`\n\u003e若在 cordova项目中，则需要安装cordova插件\n\n``` typescript\nimport { EnvConfig } from 'websql-orm';\n\nEnvConfig.useCordovaSqliteStorage = true;\n```\n\n## 启用调试日志\n\n``` typescript\nimport { EnvConfig } from 'websql-orm';\n\nEnvConfig.enableDebugLog = true;\n```\n\n## 其它配置\n\n``` typescript\nimport { EnvConfig } from 'websql-orm';\n// \b时间移除毫秒\nEnvConfig.dateFormatRemoveMillisecond = true;\n\n````\n\n## 定义表\n\n如何使用实体类定义一个表?\n\n``` typescript\nimport { database, column, ColumnType, Table } from 'websql-orm';\n\n@database(\"student_db\",\"student\")\nexport class student extends Table {\n    @column(ColumnType.STRING | ColumnType.PRIMARY)\n    id: string;\n    @column(ColumnType.STRING)\n    user_name: string;\n}\n```\n\n\u003e 1) 装饰器`@database` 定义student表，类名 student 是表名, `student_db` 是数据库名。  \n\u003e 2) 装饰器 `@column` 定义列，`ColumnType.STRING` 表示该字段是文本类型  \n\u003e 3) 每个表必须拥有一个主键字段，`ColumnType.PRIMARY` 表示该字段为主键字段  \n\u003e 4) 每个实体类必须继承 `Table`\n\n### 装饰器说明\n\n| 装饰器名   | 描述         | 示例                                 |\n| ---------- | ------------ | ------------------------------------ |\n| @database  | 定义表       | @database(\"db_name\",\"table_name\") |\n| @column    | 定义列       | @column(ColumnType.STRING)           |\n| @reference | 定义外键引用 | @reference('class_info','id')        |\n\n\u003e定义**外键引用**详见高级部分\n\n### 字段类型枚举\n\n表字段枚举值与TypeScript基本类型保持一致\n\n| 字段类型枚举       | 描述     |\n| ------------------ | -------- |\n| ColumnType.PRIMARY | 主键     |\n| ColumnType.STRING \\| ColumnType.PRIMARY | 主键(字符串)     |\n| ColumnType.NUMBER \\| ColumnType.PRIMARY | 主键(数值自增)     |\n| ColumnType.BOOLEAN | 布尔值   |\n| ColumnType.NUMBER  | 数值     |\n| ColumnType.STRING  | 字符串   |\n| ColumnType.ARRAY   | 数组     |\n| ColumnType.DATE    | 日期     |\n| ColumnType.ANY     | 任意类型 |\n\n\n## 如何使用\n\n\u003e *`以上述定义的 student 表为例`*\n\n### `websql-orm` 方法列表\n\n**sqlite.fromSql** `查询表记录，返回记录列表`\n\n``` typescript\nvar list = await sqlite.fromSql(new student(),\n            'select * from student where user_name=? and id=? ',\n            ['Tom','guid']);\n```\n\n**sqlite.fromSqlFirst** `查询首条表记录，返回首条记录`\n\n``` typescript\nvar info = await sqlite.fromSqlFirst(new student(),\n            'select * from student where user_name=? ',\n            ['Tom']);\n```\n\n**sqlite.exist** `查询记录是否存在，返回true或false`\n\n``` typescript\nvar result = await sqlite.exist(new student(),'b4ce6b51-0bd6-46ee-a5c7-d1d5a93bdee9');\n```\n\n**sqlite.insert** `插入记录,返回受影响的行数`\n\n``` typescript\nvar stu = new student();\nstu.id = uid;\nstu.user_name = 'Tom';\nvar result = await sqlite.insert(stu);\n```\n\n**sqlite.update** `修改记录,返回受影响的行数`\n\n``` typescript\nvar info = await sqlite.fromSqlFirst(new student(),\n            'select * from student where user_name=? ',\n            ['Tom']);\ninfo.user_name = 'Sam'; \nvar result = await info.save(); //或者 var result = await sqlite.update(info)\n```\n\n**sqlite.query** `查询记录，返回记录列表`\n\n``` typescript\nvar list = await sqlite.query(new student(),{ user_name:'Tom'});\n```\n\n**sqlite.queryFirst** `查询首条记录`\n\n``` typescript\nvar info = await sqlite.queryFirst(new student(),{ user_name:'Tom'});\n```\n\n**sqlite.execSql** `执行sql语句，返回受影响行数`\n\n``` typescript\nvar result = await sqlite.execSql(new student(),\n                'insert into (id,user_name) values (?,?)',\n                ['b4ce6b51-0bd6-46ee-a5c7-d1d5a93bdee9','Tom']);\n```\n\n**sqlite.delete** `删除记录`\n\n``` typescript\nvar delResult = await sqlite.delete(new student(),'291d853d-021b-4a66-9322-9d32eb27eb27');\n```\n\n**sqlite.fromSqlByJs** `查询记录(不追踪实体)`\n\n``` typescript\nvar data:any = await sqlite.fromSqlByJs(dbName,'select * from student where user_name=? ',['Tom'];\n```\n\n**sqlite.fromSqlFirstByJs** `查询首条记录(不追踪实体)`\n\n``` typescript\nvar data:any = await sqlite.fromSqlFirstByJs(dbName,'select * from student where user_name=? ',['Tom']);\n```\n\n## 在`javascript`中使用`websql-orm`\n\n### 示例\n\njavascript由于没有装饰器，目前仅提供以下三个方法。\n\n``` js\n\nvar sqliteJs= new SqliteJs('db_name');\n\nsqliteJs.fromSql(\"select * from hero where id = ?\", [id]).then(function(result){\n    console.log(result);\n});\n\nsqliteJs.fromSqlFirst(\"select * from hero where id = ?\", [id]).then(function(result){\n    console.log('成功');\n});\n\nsqliteJs.execSql(\"insert into hero (id,name) values (?,?)\", [id,name]).then(function(result){\n    if (result\u003e0){\n        console.log('成功');\n    }\n});\n\n\n```\n\n## 高级\n\n### 定义引用\n\n如何定义外键引用？\n\n``` typescript\n@database('hero_db','hero')\nexport class hero extends Table {\n\n    /**主键id */\n    @column(ColumnType.STRING | ColumnType.PRIMARY) id: string;\n\n    /**姓名 */\n    @column(ColumnType.STRING) full_name: string;\n\n    /* ... 省略其它字段定义 ... */\n\n    /**技能 */\n    @reference('id', new skill(), 'hero_id') skills: Array\u003cskill\u003e;\n\n}\n```\n\n### 示例引用\n\n#### 实体定义\n\n``` typescript\n/**\n * 英雄\n */\n@database('hero_db','hero')\nexport class hero extends Table {\n\n    /**主键id */\n    @column(ColumnType.STRING | ColumnType.PRIMARY) id: string;\n\n    /**姓名 */\n    @column(ColumnType.STRING) full_name: string;\n\n    /**年龄 */\n    @column(ColumnType.NUMBER) age: number;\n\n    /**是否是女生 */\n    @column(ColumnType.BOOLEAN) is_girl: boolean;\n\n    /**加入时间 */\n    @column(ColumnType.DATE) join_time: Date;\n\n    /**身体数据 */\n    @column(ColumnType.ANY) body_data: { stature: number, blood_type: BloodTypeEnum };\n\n    /**技能 */\n    @reference('id', new skill(), 'hero_id') skills: Array\u003cskill\u003e;\n\n}\n\n/**英雄技能 */\n@database('hero_db','skill')\nexport class skill extends Table {\n\n    /**主键id */\n    @column(ColumnType.STRING | ColumnType.PRIMARY) id: string;\n\n    /**技能名称 */\n    @column(ColumnType.STRING) name: string;\n\n    /**技能描述 */\n    @column(ColumnType.STRING) descript: string;\n\n    /**伤害值 */\n    @column(ColumnType.NUMBER) harm: number;\n\n    /**英雄id */\n    @column(ColumnType.STRING) hero_id:string;\n}\n\n\n/**\n * 血型\n * */\nexport enum BloodTypeEnum {\n    A = 1,\n    B = 2,\n    AB = 3,\n    O = 4,\n    OTHER = 5\n}\n```\n\n#### 实现\n\n``` typescript\nimport { skill } from './entities/skill';\nimport { hero } from './entities/hero';\nimport { sqlite } from \"websql-orm\";\nimport { BloodTypeEnum } from './entities/BloodTypeEnum';\n\nexport class Demo {\n    private lvbu_id = \"da93faef-bfff-49c6-92b9-8807ec196bab\";\n    private liubei_id = \"ed609b25-166f-41de-9bbc-90eb8891b688\";\n    private guanyu_id = \"7289f8cb-496c-4057-b054-3bb4a3af1d6c\";\n    constructor() {\n        var that = this;\n        setTimeout(async () =\u003e {\n            await that.addHero();\n            await that.queryHeros();\n            await that.queryHero(this.lvbu_id);\n            await that.updateHero(this.liubei_id);\n            await that.deleteHero(this.guanyu_id);\n        }, 0);\n    }\n\n    /**添加英难 */\n    async addHero() {\n        /**添加几位英雄\n         * 1.吕布\n         * 2.刘备\n         * 3.关羽\n         */\n        await this.deleteHeros();\n\n        let lvbu = new hero();\n        lvbu.id = this.lvbu_id;\n        lvbu.age = 32;\n        lvbu.full_name = \"吕布\";\n        lvbu.is_girl = false;\n        lvbu.join_time = new Date(\"2000/01/01\");\n        lvbu.body_data = { stature: 185, blood_type: BloodTypeEnum.A };\n\n        let liubei = new hero();\n        liubei.id = this.liubei_id;\n        liubei.age = 31;\n        liubei.full_name = \"刘备\";\n        liubei.is_girl = false;\n        liubei.join_time = new Date(\"2001/02/01\");\n        liubei.body_data = { stature: 178, blood_type: BloodTypeEnum.B };\n\n        let guanyu = new hero();\n        guanyu.id = this.guanyu_id;\n        guanyu.age = 30;\n        guanyu.full_name = \"关羽\";\n        guanyu.is_girl = false;\n        guanyu.join_time = new Date(\"2001/02/01\");\n        guanyu.body_data = { stature: 180, blood_type: BloodTypeEnum.AB };\n\n        await sqlite.save(lvbu);\n        await sqlite.save(liubei);\n        await sqlite.save(guanyu);\n\n        //添加技能\n        await this.addSkills();\n    }\n\n    /**添加技能 */\n    async addSkills() {\n        //给吕布添加技能\n        let lvbu_skill = new skill();\n        lvbu_skill.id = this.uuid();\n        lvbu_skill.name = \"方天画斩\";\n        lvbu_skill.descript = \"方天画斩是吕布第一伤害技能\";\n        lvbu_skill.harm = 76;\n        lvbu_skill.hero_id = this.lvbu_id;\n\n        //给刘备添加技能\n        let liubei_skill = new skill();\n        liubei_skill.id = this.uuid();\n        liubei_skill.name = \"以德服人\";\n        liubei_skill.descript = \"刘备清除身上的控制效果，并获得护盾，护盾存在期间刘备免疫控制\";\n        liubei_skill.harm = 50;\n        liubei_skill.hero_id = this.liubei_id;\n\n        //给关羽添加技能\n        let guanyu_skill = new skill();\n        guanyu_skill.id = this.uuid();\n        guanyu_skill.name = \"青龙偃月\";\n        guanyu_skill.descript = \"关羽这个英雄要持续不断的跑才能发挥本身的威力\";\n        guanyu_skill.harm = 70;\n        guanyu_skill.hero_id = this.guanyu_id;\n\n        let result = await sqlite.insert([lvbu_skill, liubei_skill, guanyu_skill]);\n        if (result \u003e 0) {\n            console.log(\"添加技能成功\");\n        } else {\n            console.log(\"添加技能失败\")\n        }\n\n\n    }\n\n    /**删除英雄 */\n    async deleteHero(id: string) {\n        let delResult = await sqlite.delete(new hero(), id);\n        if (!delResult) {\n            console.warn(`删除英雄${id}失败`);\n        } else {\n            console.log(`删除英雄${id}成功`);\n        }\n    }\n    /**删除所有英雄 */\n    async deleteHeros() {\n        var success = true;\n        var heros = await sqlite.fromSql(new hero(), \"select * from hero\", []);\n        if (heros != null \u0026\u0026 heros.length \u003e 0) {\n            for (let index = 0; index \u003c heros.length; index++) {\n                const element = heros[index];\n                let delResult = await sqlite.delete(new hero(), element.id);\n                if (!delResult) {\n                    success = false;\n                }\n            }\n        }\n        if (!success) {\n            console.warn(\"删除所有英雄失败\");\n        } else {\n            console.log(\"删除所有英雄成功\");\n        }\n\n    }\n    /**修改英雄 */\n    async updateHero(id) {\n        var _hero = await sqlite.queryFirst(new hero(), { id: id });\n        _hero.join_time = new Date();\n        await _hero.save();\n        console.log(\"修改英雄\");\n    }\n\n    /**查询所有英雄 */\n    async queryHeros() {\n        var heros = await sqlite.fromSql(new hero(), \"select * from hero\", []);\n        console.log(\"查询所有英雄:\");\n        console.log(heros);\n    }\n\n    /**查询指定的项雄 */\n    async queryHero(id: string) {\n        var hero_ = await sqlite.fromSql(new hero(), \"select * from hero where id = ?\", [id]);\n        console.log(\"查询英雄:\");\n        console.log(hero_);\n\n        var _hero = await sqlite.query(new hero(), { id: id });\n        console.log(\"查询英雄:\");\n        console.log(_hero);\n\n        var __hero = await sqlite.queryFirst(new hero(), { id: id });\n        console.log(\"查询英雄:\");\n        console.log(__hero);\n\n        var ___hero = await sqlite.fromSqlFirst(new hero(), \"select * from hero where id = ?\", [id]);\n        console.log(\"查询英雄:\");\n        console.log(___hero);\n    }\n\n    /**\n     * 生成伪guid\n     */\n    public uuid(): string {\n        let s: any[] = [];\n        let hexDigits = \"0123456789abcdef\";\n        for (let i = 0; i \u003c 36; i++) {\n            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n        }\n        s[14] = \"4\";\n        s[19] = hexDigits.substr((s[19] \u0026 0x3) | 0x8, 1);\n        s[8] = s[13] = s[18] = s[23] = \"-\";\n        let uuid = s.join(\"\");\n        return uuid;\n    }\n}\nnew Demo();\n\n```\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaitaction%2Fwebsql-orm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwaitaction%2Fwebsql-orm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaitaction%2Fwebsql-orm/lists"}