TypeORM在Node.js中的高级应用

news/2024/11/16 18:56:53
💓 博客主页:瑕疵的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.niftyadmin.cn/n/5754536.html

相关文章

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

IIoT(Industrial Internet of Things,工业物联网)

IIoT&#xff08;Industrial Internet of Things&#xff0c;工业物联网&#xff09; 是指物联网技术在工业领域的应用。它将工业设备、传感器、控制系统、数据采集设备等通过互联网或局域网连接起来&#xff0c;实现设备的互联互通和智能化管理。IIoT的目标是提高工业生产效率…

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在&#xff0c;想执行一个业务订单的检查&#xff0c;该检查的代码放在test单元测试中&#xff0c;启动也是好好的&#xff0c;当点击对应的方法执行Test的时候就报错 tip&#xff1a;已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

我的docker随笔45:在龙芯平台安装docker

本文介绍在龙芯平台安装docker。 前言 2017年下半年开始接触docker时&#xff0c;那会李大锤刚刚会爬&#xff0c;而今年&#xff08;2024年&#xff09;下半年&#xff0c;李大锤已经是一个经常考得C并且经常和妹妹吵架的二年级学生了。这么多年就过去&#xff0c;docker一直…

设计模式之工厂模式,但是宝可梦

前言 工作一年了&#xff0c;业务代码写太多&#xff0c;还是得自驱提升点技术。希望工作一年后写出来的能有更多自己的思考。 正文 工厂模式是一种创建型设计模式&#xff0c;主要的目的还是在创建一个对象时提供更灵活、更易扩展的机制。 简单工厂模式 情景模拟 小智到商…

【青牛科技】D54123 漏电保护电路介绍及应用

1、具体应用&#xff1a; 相关产品介绍&#xff1a; D54123 应用框图&#xff1a; D54123 方案介绍&#xff1a; 当正常电源电流流过时&#xff0c;电容滤波至少保证 VS端电压为12V R1、R2可根据所用电网交流电压值来选择 C4 应大于 1μF&#xff0c;C2小于 1μF 必须接入 RP&…

掌握C#中的异步编程:async和await关键字详解

C#中的异步编程模式。异步编程是现代应用程序开发中不可或缺的一部分&#xff0c;尤其在处理I/O密集型任务或网络请求时尤为重要。下面是一篇专注于C#异步编程的文章。 前言 随着互联网应用的不断发展&#xff0c;用户对应用程序响应速度的要求越来越高。传统的同步编程模型往…

Casio推出情感AI宠物机器人Moflin

‍‍ Casio最近推出了一款名为Moflin的AI宠物机器人&#xff0c;这款机器人以其独特的情感互动功能吸引了广泛关注。Moflin通过先进的AI技术&#xff0c;能够学习和理解主人的言行&#xff0c;并根据环境和互动的变化调整自己的情感反应。通过与主人的互动&#xff0c;Moflin可…