在nodejs中也有比较好用的ORM框架,比如TypeORM,Sequelize等等。
TypeORM 是一个 ORM 框架,它可以运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo 和 Electron 平台上,可以与 TypeScript 和 JavaScript (ES5,ES6,ES7,ES8)一起使用。 它的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的小型应用还是拥有多数据库的大型企业应用)应用程序。
不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 Active Record 和 Data Mapper 模式,这意味着你可以以最高效的方式编写高质量的、松耦合的、可扩展的、可维护的应用程序。
TypeORM 参考了很多其他优秀 ORM 的实现, 比如 Hibernate, Doctrine 和 Entity Framework。
TypeORM 的一些特性:
1 | 同时支持 DataMapper 和 ActiveRecord (随你选择) |
安装
1 | npm install typeorm --save |
并且需要在应用程序的全局位置导入(例如在app.ts中)
1 | import "reflect-metadata"; |
你可能还需要安装 node typings(以此来使用 Node 的智能提示):
1 | npm install @types/node --save |
安装数据库驱动:
1 | MySQL 或者 MariaDB |
- TypeScript 配置 *
此外,请确保你使用的 TypeScript 编译器版本是2.3或更高版本,并且已经在 tsconfig.json 中启用了以下设置:除此之外,你可能还需要在编译器选项的 lib 中启用 es6,或者安装 es6-shim 的 @types。1
2"emitDecoratorMetadata": true,
"experimentalDecorators": true,
快速开始
全局安装 TypeORM:npm install typeorm -g
然后转到要创建新项目的目录并运行命令:typeorm init –name MyProject –database mysql
其中 name 是项目的名称,database 是将使用的数据库。
数据库可以是以下值之一: mysql、 mariadb、 postgres、 sqlite、 mssql、 oracle、 mongodb、 cordova、 react-native、 expo、 nativescript.
此命令将在 MyProject 目录中生成一个包含以下文件的新项目:
1 | MyProject |
或者在现有 node 项目上运行 typeorm init,但要注意,此操作可能会覆盖已有的某些文件。
1 | D:\mydoc\NodeJs\前端-study-demo\typeorm-demo>typeorm init |
接下来安装项目依赖项:npm install
在安装过程中,编辑 ormconfig.json 文件并在其中编辑自己的数据库连接配置选项:
1 | //ormconfig.json |
运行:
1 | > typeorm-demo@0.0.1 start D:\mydoc\NodeJs\前端-study-demo\typeorm-demo |
绝大多数情况下,你只需要配置 host, username, password, database 或者 port 即可。
完成配置并安装所有 node modules 后,即可运行应用程序:npm start
还可以通过运行 typeorm init –name MyProject –database mysql –express 来生成一个更高级的 Express 项目
分步指南
创建实体
1 | import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; |
每个表都必须至少有一个主键列。使用 @PrimaryColumn 修饰符。自动生成的列@PrimaryGeneratedColumn()
列数据类型
见最后
创建数据库连接
1 | createConnection({ |
可以吧数据库配置信息放到ormconfig.json
1 | { |
测试
1 | import "reflect-metadata"; |
使用async/await语法
1 | import "reflect-metadata"; |
使用Repositories
使用Repository来代替EntityManage。每个实体都有自己的repository,可以对这个实体进行任何操作。
1 | import "reflect-metadata"; |
封装一个Repository
ActiveRecord方式实现
实体:
1 | import {Entity, PrimaryGeneratedColumn, Column, BaseEntity} from "typeorm"; |
操作:
1 | import "reflect-metadata"; |
结果:
1 | D:\mydoc\NodeJs\前端-study-demo\typeorm-demo>ts-node src/test2 |
Caching queries (缓存查询)
它缓存的实现,主要依赖于,自己在数据库里面建立一张缓存表,用的不是内存缓存,这样有好有坏吧,和我们的业务场景其实是不太适用的。这样做的好处,就是它不会把我们的内存跑满,而且也能大幅提高查询速度。但是我们更希望的是一个内存缓存。
它的用法,就是在数据库配置的过程中,增加一个cache字段。”cache”: true,
可以在这个方法中使用:getMany, getOne, getRawMany, getRawOne and getCount find, findAndCount, findByIds, and count
使用例子:
1 | const users = await connection |
也可以用redis当作缓存模块,这样也是比较不错的做法。
1 | { |
对应关系
一对一
要与另一个类创建一对一的关系:
其他参考:https://typeorm.io
配置
基本配置参数
1 | type: 当前要连接的数据库类型(mysql,mssql, moongo, ...) |
额外参数
1 | name: 设置连接名,连多个数据库的时候,需要获取连接的时候可用 getConnection('name') 的方式取得对应的数据库连接; |
创建多个数据库连接
1 | [{ |
获取指定数据库连接:
1 | 方式一: |
使用 QueryBuilder
1 | import "reflect-metadata"; |
附录:
列数据类型
1 | //主键自动生成列类型,主要为整型、小数等数值类型 |