TypeORM在Node.js中的高级应用

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

TypeORM在Node.js中的高级应用

TypeORM在Node.js中的高级应用

  • TypeORM在Node.js中的高级应用
    • 引言
    • TypeORM 基本概念
      • 1. 实体(Entity)
      • 2. 数据库连接
      • 3. 查询构建器
      • 4. 事务处理
      • 5. 迁移管理
    • 连接配置
      • 1. 使用 JSON 对象配置
      • 2. 使用环境变量配置
    • 实体定义
      • 1. 基本实体
      • 2. 关联实体
    • 查询构建
      • 1. 基本查询
      • 2. 复杂查询
    • 事务处理
      • 1. 基本事务
      • 2. 回滚事务
    • 迁移管理
      • 1. 创建迁移文件
      • 2. 编写迁移文件
      • 3. 运行迁移
      • 4. 回滚迁移
    • 最佳实践
      • 1. 使用环境变量
      • 2. 代码复用
      • 3. 事务处理
      • 4. 迁移管理
      • 5. 日志记录
    • 实际案例
      • 1. 博客系统
      • 2. 电商系统
    • 未来展望
      • 1. 技术创新
      • 2. 社区支持
      • 3. 普及应用
    • 结论
    • 参考文献
      • 代码示例
        • 定义实体
        • 连接数据库
        • 执行查询

引言

TypeORM 是一个非常强大的 ORM(对象关系映射)库,适用于 TypeScript 和 JavaScript 的 Node.js 应用程序。它支持多种数据库,如 MySQL、PostgreSQL、SQLite、Mssql 等,并提供了丰富的功能来简化数据库操作。本文将详细介绍 TypeORM 在 Node.js 中的高级应用,包括连接配置、实体定义、查询构建、事务处理、迁移管理等方面。

TypeORM 基本概念

1. 实体(Entity)

实体是 TypeORM 中的基本单元,表示数据库表中的记录。通过定义实体类,可以方便地进行数据库操作。

2. 数据库连接

TypeORM 使用连接配置来建立与数据库的连接。连接配置可以是 JSON 对象或环境变量。

3. 查询构建器

TypeORM 提供了强大的查询构建器,可以方便地构建复杂的 SQL 查询。

4. 事务处理

事务处理确保了一组数据库操作的原子性,即要么全部成功,要么全部失败。

5. 迁移管理

迁移管理允许你通过代码来管理数据库结构的变化,确保数据库模式与应用程序保持同步。

连接配置

1. 使用 JSON 对象配置

import { createConnection } from 'typeorm';createConnection({type: 'mysql',host: 'localhost',port: 3306,username: 'test',password: 'test',database: 'test',entities: [__dirname + '/entity/**/*.ts' // 指定实体文件路径],synchronize: true, // 自动同步数据库结构logging: false, // 是否开启日志
}).then(connection => {console.log('Connected to database!');
}).catch(error => console.log(error));

2. 使用环境变量配置

import { createConnection } from 'typeorm';
import * as dotenv from 'dotenv';dotenv.config();createConnection({type: 'mysql',host: process.env.DB_HOST,port: parseInt(process.env.DB_PORT),username: process.env.DB_USERNAME,password: process.env.DB_PASSWORD,database: process.env.DB_DATABASE,entities: [__dirname + '/entity/**/*.ts'],synchronize: true,logging: false,
}).then(connection => {console.log('Connected to database!');
}).catch(error => console.log(error));

实体定义

1. 基本实体

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@Column()email: string;
}

2. 关联实体

import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, OneToMany } from 'typeorm';@Entity()
export class Post {@PrimaryGeneratedColumn()id: number;@Column()title: string;@ManyToOne(type => User, user => user.posts)author: User;
}@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@Column()email: string;@OneToMany(type => Post, post => post.author)posts: Post[];
}

查询构建

1. 基本查询

import { getRepository } from 'typeorm';
import { User } from './entity/User';const userRepository = getRepository(User);// 查找所有用户
const users = await userRepository.find();// 查找特定用户
const user = await userRepository.findOne(1); // 通过 ID 查找
const userByEmail = await userRepository.findOne({ where: { email: 'example@example.com' } }); // 通过条件查找

2. 复杂查询

import { getRepository } from 'typeorm';
import { User } from './entity/User';const userRepository = getRepository(User);const users = await userRepository.createQueryBuilder('user').where('user.name = :name', { name: 'John Doe' }).andWhere('user.email LIKE :email', { email: '%example.com' }).orderBy('user.id', 'DESC').skip(10).take(10).getMany();

事务处理

1. 基本事务

import { getManager } from 'typeorm';await getManager().transaction(async transactionalEntityManager => {const user = new User();user.name = 'John Doe';user.email = 'john.doe@example.com';await transactionalEntityManager.save(user);const post = new Post();post.title = 'First Post';post.author = user;await transactionalEntityManager.save(post);
});

2. 回滚事务

import { getManager } from 'typeorm';try {await getManager().transaction(async transactionalEntityManager => {const user = new User();user.name = 'John Doe';user.email = 'john.doe@example.com';await transactionalEntityManager.save(user);const post = new Post();post.title = 'First Post';post.author = user;await transactionalEntityManager.save(post);throw new Error('Something went wrong!');});
} catch (error) {console.error(error);
}

迁移管理

1. 创建迁移文件

typeorm migration:create -n CreateUsersTable

2. 编写迁移文件

import { MigrationInterface, QueryRunner } from 'typeorm';export class CreateUsersTable1604123456789 implements MigrationInterface {public async up(queryRunner: QueryRunner): Promise<void> {await queryRunner.query(`CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR NOT NULL,email VARCHAR NOT NULL UNIQUE)`);}public async down(queryRunner: QueryRunner): Promise<void> {await queryRunner.query(`DROP TABLE users`);}
}

3. 运行迁移

typeorm migration:run

4. 回滚迁移

typeorm migration:revert

最佳实践

1. 使用环境变量

通过环境变量来配置数据库连接信息,可以提高代码的可维护性和安全性。

2. 代码复用

通过定义通用的实体和方法,可以减少重复代码,提高开发效率。

3. 事务处理

对于涉及多个数据库操作的业务逻辑,使用事务处理可以确保数据的一致性。

4. 迁移管理

通过迁移管理,可以方便地管理数据库结构的变化,确保数据库模式与应用程序保持同步。

5. 日志记录

开启日志记录可以帮助调试和优化数据库操作。

实际案例

1. 博客系统

博客系统通常包含用户、文章和评论等模块。通过 TypeORM,可以方便地管理这些模块的数据关系和操作。
电商系统的 TypeORM 应用案例

2. 电商系统

电商系统通常包含商品、订单和用户等模块。通过 TypeORM,可以方便地管理这些模块的数据关系和操作。

未来展望

1. 技术创新

随着 TypeScript 和 Node.js 的发展,TypeORM 将继续改进和完善,提供更多强大的功能。

2. 社区支持

TypeORM 拥有活跃的社区支持,可以及时获得帮助和反馈。

3. 普及应用

随着技术的成熟和文档的完善,TypeORM 将在更多的项目中得到应用,成为主流的 ORM 解决方案。

结论

TypeORM 是一个功能强大且易用的 ORM 库,适用于 TypeScript 和 JavaScript 的 Node.js 应用程序。通过本文的介绍和实际案例,希望读者能够更好地理解和应用 TypeORM,提升开发效率和代码质量。

参考文献

  • TypeORM. (2021). TypeORM Documentation.
  • Roman Kuba. (2018). TypeORM: The Complete Developer's Guide.
  • Basarat Ali Syed. (2017). Learning TypeScript.

代码示例

以下是一个简单的 TypeORM 应用示例,展示了如何定义实体、连接数据库和执行查询。

定义实体
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@Column()email: string;
}
连接数据库
import { createConnection } from 'typeorm';createConnection({type: 'mysql',host: 'localhost',port: 3306,username: 'test',password: 'test',database: 'test',entities: [__dirname + '/entity/**/*.ts'],synchronize: true,logging: false,
}).then(connection => {console.log('Connected to database!');
}).catch(error => console.log(error));
执行查询
import { getRepository } from 'typeorm';
import { User } from './entity/User';const userRepository = getRepository(User);// 查找所有用户
const users = await userRepository.find();
console.log(users);// 查找特定用户
const user = await userRepository.findOne(1); // 通过 ID 查找
console.log(user);const userByEmail = await userRepository.findOne({ where: { email: 'example@example.com' } }); // 通过条件查找
console.log(userByEmail);

这个示例展示了如何使用 TypeORM 定义实体、连接数据库和执行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472659.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring整合Redis

前言 在Spring项目中整合Redis&#xff0c;能显著提升数据缓存、分布式锁、会话管理等操作的效率。Jedis作为轻量级的Java Redis客户端&#xff0c;搭配Spring Data Redis模块&#xff0c;能够简化Redis的连接和数据操作&#xff0c;实现更高性能的读写与灵活的缓存管理。本文…

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建…

一文3000字从0到1带你进行Mock测试(建议收藏)

​什么是mock&#xff1f; ​mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为&#xff0c;很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 为什么要使用Mock&#xff1f; 之所以使用mock测试&#xff0c;是因…

小程序如何完成订阅

小程序如何完成订阅 参考相关文档实践问题处理授权弹窗不再触发引导用户重新授权 参考相关文档 微信小程序实现订阅消息推送的实现步骤 发送订阅消息 小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 实践 我们需要先选这一个模板&#xff0c;具体流程参考…

SOHO场景开局(小型,多子网):AP+管理型交换机+路由器+光猫

业务需求 1. 实现除光猫外&#xff0c;整网设备通过APP进行开局&#xff0c;开局部署完成后&#xff0c;能够通过APP远程运维。 2. 需要单独划分访客、办公、视频监控3个子网&#xff0c;其中访客子网供顾客无线上网使用&#xff0c;办公子网用于接入无线和有线办公终端&#x…

C++map和set(二)

1.map的opeator[] 功能&#xff1a; 如果访问对象存在就返回指定键的值的引用&#xff0c;如果指定的键不存在会插入新的键值对&#xff0c;键是传递给operator[]的参数&#xff0c;值是使用该值类型的默认构造函数构造的(对于简单类型通常是0或者空字符)。 代码示例&#xf…

[Linux]多线程详解

多线程 1.线程的概念和理解1.1线程的优点1.2线程的缺点1.3线程的设计1.4线程 VS 进程 2.线程控制2.1线程等待2.2 线程终止2.3 线程分离 3.线程互斥3.1背景3.2抢票代码演示3.3保护公共资源&#xff08;加锁&#xff09;3.3.1创建锁/销毁锁3.3.2申请锁/尝试申请锁/解锁 3.4解决抢…

大学语文教材电子版(第十一版)教学用书PDF及课件

大学语文课件&#xff1a;https://caiyun.139.com/m/i?005CiDusEVWnR 《大学语文》&#xff08;第十一版&#xff09;主编&#xff1a;徐中玉 齐森华 谭帆。 大学语文教材电子版教师用书PDF第一课《齐桓晋文之事》艺术赏析&#xff1a; 孟子四处游说&#xff0c;养成善辩的…

MySQL【七】

字符串函数 数学函数 日期函数 条件控制函数 类型转换函数 系统信息函数 自定义函数 DELIMITER  CREATE FUNCTION 函数名([参数名 参数数据类型[,…]])RETURNS 函数返回值的数据类型BEGIN函数体;RETURN 语句;ENDDELIMITER ;sql ########## 定义一个函数maxofthree()&#x…

第三百二十三节 Java线程教程 - Java同步器

Java线程教程 - Java同步器 同步器对象与一组线程一起使用。 它维护一个状态&#xff0c;根据它的状态&#xff0c;它让一个线程通过或强迫它等待。 本节将讨论四种类型的同步器&#xff1a; SemaphoresBarriersLatchesExchangers 信号量 信号量用于控制可以访问资源的线程…

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent&#xff0c;它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象&#xff0c;都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件&#xff1a;表示用户的动作事件&…

Ubuntu从入门到精通(一)系统安装

Ubuntu从入门到精通&#xff08;一&#xff09; 1 Ubuntu镜像选择 下载Ubuntu 20.04系统ISO镜像 安装 Ubuntu 20.04系统,就必须有 Ubuntu 20.04系统软件安装程序可以通过浏览器访问Ubuntu20.04的官方站点&#xff0c; 然后在导舰栏找划 Dowwnloads->Mirrors链接&#xff…

用户自定义IP核——ZYNQ学习笔记6

一、试验任务 通过自定义一个 LED IP 核&#xff0c;通过 PS 端的程序来控制底板上 PL 端 LED1 呈现呼吸 灯的效果&#xff0c;并且 PS 可以通过 AXI 接口来控制呼吸灯的开关和呼吸的频率。 二、创建IP核 三、创建工程&#xff0c;调用IP #include "stdio.h" #includ…

Elasticsearch 8.16.0:革新大数据搜索的新利器

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

ServletConfig、ServletContext、HttpServletRequest与HttpServletResponse常见API

目录 一、ServletConfig 二、ServletContext 三、ServletContext其他重要API (一)获取文件路径和上下文 (二)域对象的相关API 四、HttpServletRequest常见API (一)获取请求行/头信息相关 (二)获得请求参数相关 五、HttpServletResponse常见API 一、ServletConfig Se…

MySQL缓存使用率超过80%的解决方法

MySQL缓存使用率超过80%的解决方法 一、识别缓存使用率过高的问题1.1 使用SHOW GLOBAL STATUS命令监控1.2 监控其他相关指标二、分析缓存使用率过高的原因2.1 数据量增长2.2 查询模式变化2.3 配置不当三、解决缓存使用率过高的方法3.1 调整Buffer Pool大小3.1.1 计算合理的Buff…

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…