TypeScript 中使用 TypeORM 的最佳实践

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

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


猜你喜欢

  • 如何在 SASS 中使用 "@while" 循环语句?

    前言 SASS 是一种 CSS 预处理器,它可以帮助我们更快速、更高效地编写 CSS。而 "@while" 循环语句则可以让我们在 SASS 中更灵活地处理循环操作。

    7 个月前
  • 解决 Angular 项目中出现的依赖冲突问题

    在开发 Angular 项目时,我们常常会遇到依赖冲突的问题。这种情况下,我们需要解决这些冲突,以确保项目的正常运行。本文将介绍如何解决 Angular 项目中出现的依赖冲突问题,并提供示例代码,帮助...

    7 个月前
  • 在 Deno 中使用 Docker 容器的最佳实践

    随着 Deno 的不断发展,越来越多的开发者开始尝试使用 Deno 来构建前端应用程序。而 Docker 作为一种流行的容器化技术,也被广泛应用于前端开发中。本文将介绍如何在 Deno 中使用 Doc...

    7 个月前
  • 如何在 Tailwind 中使用 CSS 动画

    Tailwind 是一个流行的 CSS 框架,它提供了大量的 CSS 类,使得开发者可以轻松地创建出漂亮的用户界面。除了这些常规的 CSS 类,Tailwind 还支持 CSS 动画,让我们可以为我们...

    7 个月前
  • IOS 中 PWA 应用在 Safari 中打开后返回首页崩溃怎么解决?

    背景 PWA(Progressive Web Apps)是一种新型的 Web 应用程序模型,可以将网页应用转化为类似原生应用的体验。在 IOS 平台上,用户可以通过 Safari 浏览器打开 PWA ...

    7 个月前
  • TypeScript 中如何正确使用对象 (Object)

    在 TypeScript 中,对象 (Object) 是一种非常常见的数据类型。正如在其他编程语言中一样,对象可以用来存储一组相关的数据和功能。但是,在 TypeScript 中正确地使用对象需要遵循...

    7 个月前
  • 使用 ESLint 进行 JavaScript 的代码风格规范

    什么是 ESLint? ESLint 是一个开源的 JavaScript 代码检查工具,用于检查代码中的语法和代码风格问题。它可以帮助开发者在编写代码时遵循一致的代码风格和最佳实践,从而提高代码的可读...

    7 个月前
  • ES7 中如何使用 Array.prototype.includes 方法实现多条件筛选

    在前端开发中,我们经常需要对数组进行筛选操作。在 ES7 中,新增了 Array.prototype.includes 方法,可以帮助我们更方便地实现数组的多条件筛选。

    7 个月前
  • React Native 中如何实现 Webview 组件

    React Native 是一款由 Facebook 推出的跨平台移动应用开发框架,它可以让开发者用 JavaScript 和 React 的方式来开发原生应用。在 React Native 中,我们...

    7 个月前
  • Mongoose 常见问题及解决方案:TypeError Cannot read property 'x' of null

    在使用 Mongoose 进行开发时,开发者可能会遇到一些常见问题,其中一个较为常见的问题就是 TypeError Cannot read property 'x' of null。

    7 个月前
  • 使用 Socket.io 和 Jquery 实现即时搜索功能的完整教程

    介绍 即时搜索功能是现代网站中常见的功能之一,它可以让用户在输入关键词的同时动态地获取相关的搜索结果。本文将介绍如何使用 Socket.io 和 Jquery 实现即时搜索功能,并提供完整的代码示例。

    7 个月前
  • Hapi 框架部署在 Docker 容器中的实践

    前言 Hapi 是 Node.js 中一款优秀的 Web 应用框架,它具有高度的可扩展性和灵活的路由配置,可以帮助开发者快速构建高性能的 Web 应用程序。而 Docker 是一款流行的容器化技术,可...

    7 个月前
  • 使用 Web Components 实现可复用的表单组件

    什么是 Web Components Web Components 是一种新的 Web 技术,它可以帮助我们创建可复用的自定义 HTML 元素。Web Components 由四个不同的技术组成: ...

    7 个月前
  • 单元测试的范例:使用 Mocha 测试框架的技巧与经验

    在前端开发中,单元测试是非常重要的一部分。它可以帮助开发者在开发过程中快速发现代码中的错误,提高代码质量和可维护性。Mocha 是一个流行的 JavaScript 测试框架,它提供了一系列的 API ...

    7 个月前
  • 如何处理 CSS Reset 后引起的空白字符问题

    在前端开发中,我们经常会使用 CSS Reset 对网页进行初始化,以便在不同的浏览器环境下获得一致的显示效果。然而,使用 CSS Reset 后,有时会出现一些奇怪的问题,例如页面中出现了大量的空白...

    7 个月前
  • ECMAScript 2021 如何使用 Proxy 实现数据缓存?

    前言 在前端开发中,数据缓存是一个非常常见的需求。在某些场景下,我们需要在多次访问同一数据时,避免重复请求,从而提高页面性能和用户体验。在 ECMAScript 2021 中,我们可以使用 Proxy...

    7 个月前
  • 使用 Server-Sent Events 实现 Web 版广告展示

    在 Web 应用中,广告展示是一项非常重要的业务。为了提高用户的体验,我们需要尽可能快地加载广告,并且在用户关闭或者刷新页面时能够及时更新广告内容。本文将介绍如何使用 Server-Sent Even...

    7 个月前
  • 解决 Jest 的 “unexpected token” 错误

    在前端开发中,Jest 是一个非常流行的测试框架,它可以帮助开发者进行单元测试和集成测试。但是,在使用 Jest 进行测试时,我们有时会遇到 “unexpected token” 错误,这是由于 Je...

    7 个月前
  • 利用 Fastify 实现 Nginx+WebSocket 负载均衡

    本文介绍如何使用 Fastify 和 Nginx 来实现 WebSocket 的负载均衡。WebSocket 是一种在 Web 应用程序中实现双向通信的协议,它可以使服务器主动向客户端发送消息,而不需...

    7 个月前
  • Node.js 实现嵌入式编程的详解

    介绍 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,它可以在服务器端运行 JavaScript 代码。Node.js 的出现,让 JavaScript 不仅仅...

    7 个月前

相关推荐

    暂无文章