TypeScript 中使用 TypeORM 的最佳实践

TypeORM 是一个支持多种数据库的 TypeScript ORM 框架,它提供了许多便捷的功能,如数据模型定义、关系映射、查询构建和事务管理等。在 TypeScript 项目中,TypeORM 可以帮助我们更好地管理数据库操作,提高代码的可维护性和可读性。

本文将介绍在 TypeScript 中使用 TypeORM 的最佳实践,包括如何定义数据模型、如何进行关系映射、如何构建查询和如何管理事务。我们将以一个简单的博客应用为例,演示这些实践的具体操作。

安装和配置

首先,我们需要安装 TypeORM 和相应的数据库驱动程序。假设我们要使用 PostgreSQL 数据库,可以运行以下命令:

--- ------- ------- --

接着,我们需要在项目中创建一个 TypeORM 的配置文件 ormconfig.json,用于配置数据库连接和其他选项。例如,我们可以这样配置连接到本地的 PostgreSQL 数据库:

-
  ------- -----------
  ------- ------------
  ------- -----
  ----------- -----------
  ----------- -----------
  ----------- -------
  -------------- -----
  ---------- ------
  ----------- ----------------------
  ------------- ------------------------
  -------------- ------------------------
-

其中,type 表示数据库类型,host 表示主机名,port 表示端口号,usernamepassword 表示数据库用户和密码,database 表示数据库名称,synchronize 表示是否自动同步数据模型和数据库结构,logging 表示是否启用日志记录,entitiesmigrationssubscribers 分别表示数据模型、迁移和订阅器所在的目录。

定义数据模型

在 TypeORM 中,数据模型通常由实体(Entity)类来表示,每个实体类对应一个数据库表。实体类可以定义属性、关系和方法,以及使用装饰器来描述它们的特征。

例如,我们可以定义一个 User 实体类,表示博客应用中的用户:

------ - ------- ----------------------- ------- --------- - ---- ----------
------ - ---- - ---- ---------

---------
------ ----- ---- -
  -------------------------
  --- -------

  ---------
  ----- -------

  ---------
  ------ -------

  ------------- -- ----- ---- -- ------------
  ------ -------
-

其中,@Entity() 装饰器表示这是一个实体类,@PrimaryGeneratedColumn() 表示这是一个自动生成的主键,@Column() 表示这是一个列属性,@OneToMany() 表示这是一个一对多的关系,它连接了 UserPost 实体类,其中 post => post.author 表示 Post 实体类中的 author 属性对应 User 实体类中的多个 posts 属性。

类似地,我们也可以定义一个 Post 实体类,表示博客应用中的文章:

------ - ------- ----------------------- ------- --------- - ---- ----------
------ - ---- - ---- ---------

---------
------ ----- ---- -
  -------------------------
  --- -------

  ---------
  ------ -------

  --------- ----- ------ --
  -------- -------

  ------------- -- ----- ---- -- -----------
  ------- -----
-

其中,@ManyToOne() 表示这是一个多对一的关系,它连接了 PostUser 实体类,其中 user => user.posts 表示 User 实体类中的 posts 属性对应 Post 实体类中的单个 author 属性。

进行关系映射

在 TypeORM 中,关系映射是指将实体类中的属性和关系映射到数据库表中的列和外键。TypeORM 提供了多种关系映射的方式,如一对一、一对多、多对一和多对多等。

例如,我们可以在 ormconfig.json 中配置关系映射的选项,如下所示:

-
  ----------- ----------------------
  ------------ -----
  ------------ -----
  ---------- -----
  ----------------- ----
-

其中,relations 表示是否启用关系映射,joinTable 表示是否启用连接表(用于多对多关系),cascade 表示是否启用级联操作(如删除关联实体时同时删除关系),eagerRelations 表示是否启用预加载关系(用于优化查询性能)。

构建查询

在 TypeORM 中,查询通常由查询构建器(QueryBuilder)来表示,它可以帮助我们方便地构建复杂的查询语句。查询构建器提供了多种方法,如 select()where()orderBy()leftJoinAndSelect() 等,用于构建查询条件、排序规则和关联查询等。

例如,我们可以使用查询构建器来查询所有文章及其作者的信息:

------ - ------------- - ---- ----------
------ - ---- - ---- ------------------

----- -------------- - --------------------

----- ----- - ----- --------------
  ---------------------------
  --------------------------------- ---------
  -----------

-------------------

其中,createQueryBuilder() 方法返回一个查询构建器对象,leftJoinAndSelect() 方法表示进行左连接和预加载,getMany() 方法表示获取所有查询结果。

类似地,我们也可以使用查询构建器来查询特定作者的所有文章:

----- ----- - ----- --------------
  ---------------------------
  --------------------------------- ---------
  ----------------- - ----- - --- - --
  -----------

其中,where() 方法表示添加查询条件,:id 表示参数占位符,{ id: 1 } 表示实际参数值。

管理事务

在 TypeORM 中,事务管理是指将多个数据库操作封装在一个事务中,以保证它们的原子性和一致性。TypeORM 提供了多种事务管理的方式,如基于实体管理器(EntityManager)和基于连接(Connection)的事务管理等。

例如,我们可以使用实体管理器来管理事务:

------ - ---------- - ---- ----------
------ - ---- - ---- ------------------

----- -------------- - --------------------

----- ------------------------------ ------------- -- -
  ----- ---- - -----------------------
    ------ ---- ------
    -------- ------- --------
    ------- - --- - -
  ---

  ----- -------------------------
---

其中,getManager() 方法返回一个实体管理器对象,transaction() 方法表示开启一个事务,create() 方法表示创建一个新的实体对象,save() 方法表示保存实体到数据库中。

类似地,我们也可以使用基于连接的事务管理来管理事务:

------ - ---------------- - ---- ----------
------ - ---- - ---- ------------------

----- -------------- - --------------------

----- ---------- - ----- -------------------

----- ----------- - -------------------------------

----- ----------------------

----- -------------------------------

--- -
  ----- ---- - -----------------------
    ------ ---- ------
    -------- ------- --------
    ------- - --- - -
  ---

  ----- -------------------------------

  ----- --------------------------------
- ----- ----- -
  ----- ----------------------------------
- ------- -
  ----- ----------------------
-

其中,createConnection() 方法返回一个新的数据库连接对象,createQueryRunner() 方法返回一个查询运行器对象,connect() 方法表示连接到数据库,startTransaction() 方法表示开启一个事务,manager 属性表示实体管理器对象,commitTransaction() 方法表示提交事务,rollbackTransaction() 方法表示回滚事务,release() 方法表示释放查询运行器对象。

总结

本文介绍了在 TypeScript 中使用 TypeORM 的最佳实践,包括如何定义数据模型、如何进行关系映射、如何构建查询和如何管理事务。通过这些实践,我们可以更好地管理数据库操作,提高代码的可维护性和可读性。希望本文能够对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6607dbdad10417a222679311