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.mzph.cn/bicheng/61203.shtml

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

相关文章

11.15组会汇报

概述 不经意传输协议,也叫茫然传输协议,是一种保护隐私的两方通信协议,消息发送者持有两条待发送的消息,接收者选择一条进行接收,事后发送者对接收者获取哪一条消息毫不知情,接收者对于未选择的消息也无法获取任何信息。即1-out-of-2 OT。在OT协议中,发送方拥有全部的数据权限,…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

基于ARM+FPGA的电力通信管理机IEC61850规约通信机的实现

本章通过对比传统的通信管理机方案对需要支持多RS485端口的不足之处&#xff0c; 以及在进行海量数据处理时的性能瓶颈&#xff0c;本文使用Intel全新的Cyclone V SoC FPGA芯片&#xff0c;充分发挥FPGA的高速并行运算特性以及现场可配置优势&#xff0c;并且结合 ARM处理器的…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介 登录模块很简单&#xff0c;前端发送账号密码的表单&#xff0c;后端接收验证后即可~ 淦&#xff01;可是我想多了&#xff0c;于是有了以下几个问题&#xff08;里面还包含网络安全问题&#xff09;&#xff1a; 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…

利用云计算实现高效的数据备份与恢复策略

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 利用云计算实现高效的数据备份与恢复策略 利用云计算实现高效的数据备份与恢复策略 利用云计算实现高效的数据备份与恢复策略 引…

基于 PyTorch 从零手搓一个GPT Transformer 对话大模型

一、从零手实现 GPT Transformer 模型架构 近年来&#xff0c;大模型的发展势头迅猛&#xff0c;成为了人工智能领域的研究热点。大模型以其强大的语言理解和生成能力&#xff0c;在自然语言处理、机器翻译、文本生成等多个领域取得了显著的成果。但这些都离不开其背后的核心架…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

聊聊Flink:Flink中的时间语义和Watermark详解

该篇主要讲Flink中的时间语义、Flink 水印机制以及Flink对乱序数据的三重保障。 一、Flink的三种时间语义 1.1 Event Time Event Time指的是数据流中每个元素或者每个事件自带的时间属性&#xff0c;一般是事件发生的时间。由于事件从发生到进入Flink时间算子之间有很多环节&…

CSS基础选择器与div布局

基础选择器一 全局选择器 可以与任何元素匹配&#xff0c;优先级最低&#xff0c;不推荐使用 *{margin: 0;padding: 0;}元素选择器 HTML文档中的元素&#xff0c;p、b、div、a、img、body等。 标签选择器&#xff0c;选择的是页面上所有这种类型的标签&#xff0c;所以经常…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析

前言 在程序员或DBA的日常工作中&#xff0c;编写并执行SQL语句如同日常饮食中的一餐一饭&#xff0c;再寻常不过。然而&#xff0c;在使用命令行或黑屏客户端处理SQL时&#xff0c;常会遇到编写难、错误排查缓慢以及查询结果可读性不佳等难题&#xff0c;因此&#xff0c;图形…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

三角波生成函数

% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒&#xff0c;步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…

Lc70--319.两个数组的交集(二分查找)---Java版

1.题目描述 2.思路 用集合求交集&#xff0c;因为集合里面的元素要满足不重复、无序、唯一。使得集合在去重、查找和集合操作&#xff08;如交集、并集、差集等&#xff09;中非常高效和方便。 3.代码实现 class Solution {public int[] intersection(int[] nums1, int[] nu…

操作系统实验 C++实现生产者-消费者问题

实验目的 1、进一步加深理解进程同步的概念 2、加深对进程通信的理解 3、了解Linux下共享内存的使用方法 实验内容 1、按照下面要求&#xff0c;写两个c程序&#xff0c;分别是生产者producer.c以及customer.c 2、一组生产者和一组消费者进程共享一块环形缓冲区 使用共…