TypeORM在Node.js中的高级应用

news2024/12/21 22:23:12
💓 博客主页:瑕疵的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.coloradmin.cn/o/2242030.html

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

相关文章

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…

【云岚到家】-day10-2-冷热处理及统计

【云岚到家】-day10-2-冷热处理及统计 3.7 历史订单3.7.1 冷热分离方案1&#xff09;冷热分离需求2&#xff09;分布式数据库3&#xff09;冷热分离方案 3.7.2 订单同步1&#xff09;创建历史订单数据库2&#xff09;订单同步3&#xff09;测试订单同步4&#xff09;小结 3.7.3…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

新人如何做好项目管理?|京东零售技术人成长

“管理是一种实践&#xff0c;其本质不在于知&#xff0c;而在于行”——彼得德鲁克 作为一名初入职场的校招生&#xff0c;你是否有过这样的疑问&#xff1a;项目经理究竟扮演着怎样的角色&#xff1f;是老板的传声筒&#xff0c;单纯地传达上级的指令&#xff1f;还是团队的…

MySQL社区版的启动与连接

1.启动&#xff1a; 注意&#xff1a;MySQL是默认开机自启的 方式一&#xff1a; 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称&#xff0c;然后鼠标右键点击启动 方式二&#xff1a; 1.在开始选项中搜索“cmd”命令提示符&#xff0c;使用管理员身份运行 …

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame&#xff0c;然后再次转成 AVPacket&#xff0c;那么这AVPakcet数据要怎么办呢&#xff1f;分为三种情况&#xff1a; 一种是将AVPacket存储成h264文件&#xff0c;由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上)&#xff1a;成熟可靠的传输层协议-CSDN博客 &#x1f95d;在上篇博客中&#xff0c;我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨&#xff0c;提供了初步的理解和概览。本…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

菲涅耳全息图

菲涅耳全息图&#xff1a;记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…

Pygame坦克大战游戏开发实验报告

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中&#xff0c;循环是一种非常强大的控制结构&#xff0c;它允许我们重复执行一段代码直到满足某个条件为止。在微搭中&#xff0c;我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

C++:基于红黑树封装map和set

目录 红黑树的修改 红黑树节点 红黑树结构 红黑树的迭代器 红黑树Insert函数 红黑树的默认成员函数 修改后完整的红黑树 set、map的模拟实现 set map 测试封装的set和map 红黑树的修改 想要用红黑树封装map和set&#xff0c;需要对之前实现的key-value红黑树进行修…

【深度学习基础 | 预备知识】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议&#xff0c;运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100]&#xff0c;可以&#xff1a; 还可以换map里…

从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi

sophpi 是 算能官方针对 sg200x 系列的 SDK 仓库 https://github.com/sophgo/sophpi &#xff0c;支持 cv180x、cv81x、sg200x 系列的芯片。 SG2002 简介 SG2002 是面向边缘智能监控 IP 摄像机、智能猫眼门锁、可视门铃、居家智能等多项产品领域而推出的高性能、低功耗芯片&a…

【客户服务】互联网时代客户投诉处理金点子

互联网时代客户投诉新特点 客户投诉渠道广投诉的内容涉及到企业的各个方面客户维权意识越来越强负面效应很难管 卓越客户体验成为企业核心竞争力 移动互联网与社会化媒体背景下&#xff0c;客户的全方位感知、情感、卓越体验、高效需求成为驱动技术、应用、终端以及服务持续…

SQL 审核在 CloudQuery 的四大场景应用

数据库作为数据的核心载体&#xff0c;其安全性和稳定性对业务的影响至关重要。而在我们日常业务中&#xff0c;SQL 编写不当是引起数据库故障的一个重要原因&#xff0c;轻则影响数据库性能&#xff0c;重则可能直接导致「雪崩」。因此&#xff0c;SQL 审核作为 SQL 代码投入生…

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期完整示例1. 创建 Vue 项目&#xff08;如果还没有&#xff09;2. 定义和使用组件3. 在主应用中使用组件4. 运行应用完整项目结构 参考文献 概述 V…

Jmeter基础篇(24)Jmeter目录下有哪些文件夹是可以删除,且不影响使用的呢?

一、前言 Jmeter使我们日常做性能测试最常用的工具之一啦&#xff01;但是我们在和其他同学协同工作的时候&#xff0c;偶尔也会遇到一些问题&#xff0c;例如我想要给别人发送一个Jmeter工具包&#xff0c;但这个文件包往往会很大&#xff0c;比较浪费流量和空间&#xff0c;…

Python_爬虫3_Requests库网络爬虫实战(5个实例)

目录 实例1&#xff1a;京东商品页面的爬取 实例2&#xff1a;亚马逊商品页面的爬取 实例3&#xff1a;百度360搜索关键词提交 实例4&#xff1a;网络图片的爬取和存储 实例5&#xff1a;IP地址归地的自动查询 实例1&#xff1a;京东商品页面的爬取 import requests url …