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 定义实体、连接数据库和执行查询。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Mysql] Mysql的多表查询----多表关系(下)

4、操作 方式二&#xff1a;创建表之后设置外键约束 外键约束也可以在修改表时添加&#xff0c;但是添加外键约束的前提是&#xff1a;从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法&#xff1a; alter table <从表名> add constr…

Ethernet 系列(9)-- 基础学习::ICMP

目录 1. 缩写词&#xff1a; 2. ICMP的目的&#xff1a; 2.1 什么是ICMP&#xff1a; 2.2 什么时候使用ICMP&#xff1a; 3. ICMP 头部&#xff1a; 4. ICMP 报文类型&#xff1a; 4.1 目标不可达&#xff1a; 4.2 重定向&#xff1a; 4.3 超时&#xff1a; 4.4 Ping…

【计算机视觉】FusionGAN

1. FusionGAN论文阅读 abreheret/FusionGAN: Pytorch implementation of "Generating a Fusion Image: One’s Identity and Another’s Shape" 1.1. WHY 在现实世界中,将对象或人物转换为期望的形状是一种常用技术,但现有的图像翻译方法在处理身份和形状时存在…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

24/11/12 算法笔记<强化学习> 自注意力机制

自注意力机制&#xff08;Self-Attention Mechanism&#xff09;&#xff0c;也称为内部注意力机制&#xff0c;是一种在深度学习模型中&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉领域中广泛使用的机制。它允许模型在处理序列数据时&#xff0c…

前后端交互之动态列

一. 情景 在做项目时&#xff0c;有时候后会遇到后端使用了聚合函数&#xff0c;导致生成的对象的属性数量或数量不固定&#xff0c;因此无法建立一个与之对应的对象来向前端传递数据&#xff0c;这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…

k8s服务内容滚动升级以及常用命令介绍

查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取&#xff1a;相机图像、IMU等多源数据&#xff1b;前端视觉里程计&#xff08;Visual Odometry&#xff0c;VO&#xff09;&#xff1a;估计相机的相…

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…

如何在Typora中绘制流程图

如何在Typora中绘制流程图 在撰写文档时&#xff0c;清晰的流程图能极大地提升信息传递的效率。Typora是一款优秀的Markdown编辑器&#xff0c;支持通过Mermaid语法快速绘制流程图。本文将介绍如何在Typora中创建和自定义流程图&#xff0c;帮助你用更直观的方式呈现逻辑结构和…

莱特币转型MEME币:背后隐含的加密市场现象

随着加密市场的风云变幻&#xff0c;莱特币&#xff08;LTC&#xff09;这款曾经的“老牌矿币”近日以自嘲式推文宣布“自己是一个MEME币”&#xff0c;迅速引发了市场的广泛关注和一波围绕MEME币的炒作浪潮。这一举动看似玩笑&#xff0c;却反映出当前加密市场的一种微妙转变&…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…

LC12:双指针

文章目录 125. 验证回文串 本专栏记录以后刷题碰到的有关双指针的题目。 125. 验证回文串 题目链接&#xff1a;125. 验证回文串 这是一个简单题目&#xff0c;但条件判断自己写的时候写的过于繁杂。后面参考别人写的代码&#xff0c;首先先将字符串s利用s.toLowerCase()将其…

MySQL5.7.37安装配置

1.下载MySQL软件包并解压 2.配置环境变量 3.新建my.ini文件并输入信息 [mysqld] #端口号 port 3306 #mysql-5.7.27-winx64的路径 basedirC:\mysql-5.7.37\mysql-5.7.37-winx64 #mysql-5.7.27-winx64的路径\data datadirC:\mysql-5.7.37\mysql-5.7.37-winx64\data #最大连接数…

python习题4

1 判断车牌归属地 输入一串车牌号&#xff0c;按e结束&#xff0c;判断车牌归属于那里 例如&#xff1a; 输入&#xff1a; jingA12345 huB34567 zheA99999 e 输出&#xff1a; jing hu zhe chepai input(请输入车牌号&#xff1a;\n) lst [] while chepai ! e:lst…

【原创】java+ssm+mysql社区疫情防控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

《深度学习》VGG网络

文章目录 1.VGG的网络架构2.案例&#xff1a;手写数字识别 学习目标&#xff1a; 知道VGG网络结构的特点能够利用VGG网络完成图像分类 2014年&#xff0c;⽜津⼤学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和GoogleDeepMind公司的研究员⼀起研发出了新的深度…

探索 Python HTTP 的瑞士军刀:Requests 库

文章目录 探索 Python HTTP 的瑞士军刀&#xff1a;Requests 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests 库是什么&#xff1f;第三部分&#xff1a;如何安装 Requests 库&#xff1f;第四部分&#xff1a;Requests 库的基本函数使用方法第五部分&#xff1a…

无桥Boost-PFC 双闭环控制MATLAB仿真

一、无桥Boost-PFC原理概述 无桥 Boost-PFC&#xff08;Power Factor Correction&#xff0c;功率因数校正&#xff09;的工作原理是通过特定的电路结构和控制策略&#xff0c;对输入电流进行校正&#xff0c;使其与输入电压同相位&#xff0c;从而提高电路的功率因数&#xf…

数据结构Python版

2.3.3 双链表 双链表和链表一样&#xff0c;只不过每个节点有两个链接——一个指向后一个节点&#xff0c;一个指向前一个节点。此外&#xff0c;除了第一个节点&#xff0c;双链表还需要记录最后一个节点。 每个结点为DLinkNode类对象&#xff0c;包括存储元素的列表data、…