TypeScript 学习笔记(十五):TypeScript 与数据库的深度结合

TypeScript 学习笔记(十五):TypeScript 与数据库的深度结合

1. 引言

在前几篇学习笔记中,我们探讨了 TypeScript 的基础知识、前后端框架的结合应用、测试与调试技巧、性能优化、前端架构设计以及 TypeScript 的工具和生态系统。本篇将重点介绍 TypeScript 与数据库的深度结合,包括如何使用 TypeScript 操作关系型数据库和非关系型数据库。

2. TypeScript 与关系型数据库

关系型数据库(RDBMS)使用结构化查询语言(SQL)来管理和操作数据。常见的关系型数据库包括 MySQL、PostgreSQL 和 SQLite。在 TypeScript 中,可以使用 ORM(对象关系映射)工具来简化与数据库的交互。

2.1 使用 TypeORM

TypeORM 是一个流行的 ORM 框架,支持 TypeScript,能够简化与关系型数据库的交互。

2.1.1 安装 TypeORM 和数据库驱动
# 安装 TypeORM 和 MySQL 驱动
npm install typeorm reflect-metadata mysql

# 安装 TypeScript 和 TypeORM 类型定义
npm install -D typescript @types/node
2.1.2 配置 TypeORM

创建 ormconfig.json 文件,配置数据库连接信息。

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "password",
  "database": "test",
  "synchronize": true,
  "logging": false,
  "entities": ["src/entity/**/*.ts"]
}
2.1.3 定义实体

创建一个用户实体 src/entity/User.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  firstName!: string;

  @Column()
  lastName!: string;

  @Column()
  age!: number;
}
2.1.4 使用 TypeORM 进行数据库操作

src/index.ts 文件中进行数据库操作。

import 'reflect-metadata';
import { createConnection } from 'typeorm';
import { User } from './entity/User';

createConnection().then(async connection => {
  console.log('Inserting a new user into the database...');
  const user = new User();
  user.firstName = 'John';
  user.lastName = 'Doe';
  user.age = 25;
  await connection.manager.save(user);
  console.log('Saved a new user with id: ' + user.id);

  console.log('Loading users from the database...');
  const users = await connection.manager.find(User);
  console.log('Loaded users: ', users);

  console.log('Here you can setup and run express/koa/any other framework.');
}).catch(error => console.log(error));

3. TypeScript 与非关系型数据库

非关系型数据库(NoSQL)提供了不同于关系型数据库的存储和查询方式,常见的非关系型数据库包括 MongoDB、Redis 和 Cassandra。

3.1 使用 Mongoose 操作 MongoDB

Mongoose 是一个流行的 MongoDB ODM(对象文档映射),支持 TypeScript。

3.1.1 安装 Mongoose
# 安装 Mongoose 和 TypeScript 类型定义
npm install mongoose @types/mongoose
3.1.2 连接 MongoDB

src/index.ts 文件中连接 MongoDB。

import mongoose from 'mongoose';

mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => {
  console.log('Connected to MongoDB');
}).catch(error => console.error('Error connecting to MongoDB:', error));
3.1.3 定义 Schema 和 Model

创建一个用户模型 src/models/User.ts

import mongoose, { Document, Schema } from 'mongoose';

interface IUser extends Document {
  firstName: string;
  lastName: string;
  age: number;
}

const UserSchema: Schema = new Schema({
  firstName: { type: String, required: true },
  lastName: { type: String, required: true },
  age: { type: Number, required: true }
});

const User = mongoose.model<IUser>('User', UserSchema);

export default User;
3.1.4 使用 Mongoose 进行数据库操作

src/index.ts 文件中进行数据库操作。

import User from './models/User';

const user = new User({
  firstName: 'John',
  lastName: 'Doe',
  age: 25
});

user.save().then(() => {
  console.log('User saved');
  return User.find();
}).then(users => {
  console.log('Loaded users: ', users);
}).catch(error => console.error('Error:', error));

4. 数据库迁移

数据库迁移是指对数据库结构进行变更的过程,包括表的创建、修改和删除等。TypeScript 支持多种数据库迁移工具来管理数据库结构的变更。

4.1 使用 TypeORM 进行数据库迁移

TypeORM 提供了内置的数据库迁移功能。

4.1.1 创建迁移文件

使用 TypeORM CLI 创建迁移文件。

# 安装 TypeORM CLI
npm install -g typeorm

# 创建迁移文件
typeorm migration:create -n CreateUsersTable
4.1.2 编写迁移脚本

src/migration/CreateUsersTable.ts 文件中编写迁移脚本。

import { MigrationInterface, QueryRunner, Table } from 'typeorm';

export class CreateUsersTable1626789335123 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(new Table({
      name: 'user',
      columns: [
        { name: 'id', type: 'int', isPrimary: true, isGenerated: true, generationStrategy: 'increment' },
        { name: 'firstName', type: 'varchar' },
        { name: 'lastName', type: 'varchar' },
        { name: 'age', type: 'int' }
      ]
    }), true);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable('user');
  }
}
4.1.3 运行迁移

运行数据库迁移。

# 运行迁移
typeorm migration:run

5. 数据库测试

测试是确保数据库操作正确性的重要手段。TypeScript 提供了多种工具和库来编写和运行数据库测试。

5.1 使用 Jest 进行数据库测试

Jest 是一个流行的测试框架,可以用于编写和运行数据库测试。

5.1.1 安装 Jest 和相关依赖
# 安装 Jest 和 TypeScript 支持
npm install --save-dev jest ts-jest @types/jest

# 安装 SQLite3 用于测试
npm install sqlite3
5.1.2 配置 Jest

jest.config.js 文件中配置 Jest。

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
};
5.1.3 编写测试文件

src/__tests__/database.test.ts 文件中编写测试。

import { createConnection, getConnection } from 'typeorm';
import { User } from '../entity/User';

beforeAll(async () => {
  await createConnection({
    type: 'sqlite',
    database: ':memory:',
    dropSchema: true,
    entities: [User],
    synchronize: true,
    logging: false
  });
});

afterAll(async () => {
  const connection = getConnection();
  await connection.close();
});

test('should insert a new user into the database', async () => {
  const user = new User();
  user.firstName = 'John';
  user.lastName = 'Doe';
  user.age = 25;

  const connection = getConnection();
  await connection.manager.save(user);

  const savedUser = await connection.manager.findOne(User, user.id);
  expect(savedUser).toBeDefined();
  expect(savedUser!.firstName).toBe('John');
});

6. 结论

在本篇学习笔记中,我们探讨了 TypeScript 与数据库的深度结合,包括如何使用 TypeScript 操作关系型数据库和非关系型数据库,以及如何进行数据库迁移和测试。通过掌握这些知识,你可以更好地管理和操作数据库,提高应用的可靠性和可维护性。

下一篇学习笔记将介绍 TypeScript 与第三方库的结合使用,包括如何在 TypeScript 项目中集成和使用各种第三方库,希望你能继续关注本系列的学习笔记,进一步提升 TypeScript 编程技能。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evaporator Core

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值