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 编程技能。