📅  最后修改于: 2023-12-03 15:05:39.181000             🧑  作者: Mango
TypeORM是一个用于Node.js和TypeScript的ORM,它支持PostgreSQL, MySQL, MariaDB, SQLite以及Microsoft SQL Server等数据库,并提供了基本的CRUD操作和高级查询功能。
在使用TypeORM之前,我们需要先安装它。可以通过以下命令在项目中安装TypeORM:
npm install typeorm reflect-metadata
需要注意的是,我们需要手动安装reflect-metadata
库,因为它是TypeORM必须依赖的库。
配置TypeORM需要在项目中创建ormconfig.json文件。具体的配置如下:
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "password",
"database": "database_name",
"synchronize": true,
"logging": false,
"entities": [
"src/entities/*.ts"
],
"migrations": [
"src/migrations/*.ts"
],
"subscribers": [
"src/subscribers/*.ts"
],
"cli": {
"entitiesDir": "src/entities",
"migrationsDir": "src/migrations",
"subscribersDir": "src/subscribers"
}
}
其中,type
字段为使用的数据库类型;host
字段为数据库服务的IP地址或域名;port
字段为数据库服务的端口号;username
和password
字段为登录数据库的用户名和密码;database
字段是要操作的数据库名;synchronize
字段用于同步数据库结构,建议在开发环境中使用;logging
字段用于开启日志记录。
在TypeORM中,实体表示一个数据库表。例如,下面是一个简单的User实体:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
}
在上述代码中,@Entity()
装饰器用于标记这个类是一个实体。@PrimaryGeneratedColumn()
装饰器用于为主键属性生成自增长值。@Column()
装饰器用于标记需要映射到数据库表字段的属性。
在TypeORM中,使用Repository进行增删改查操作。Repository是用于执行数据操作的类,它了解实体的结构和类型,并映射到数据库表和行。
import { getRepository } from "typeorm";
import { User } from "../entities/User";
const userRepository = getRepository(User); // 获取实体仓库
const user = new User();
user.name = "Alice";
user.age = 18;
await userRepository.save(user); // 将新用户保存到数据库
在上述代码中,我们首先使用getRepository(User)
获取实体仓库,然后创建一个新的User实体并赋值。最后,调用userRepository.save(user)
方法将该实体保存到数据库中。
import { getRepository } from "typeorm";
import { User } from "../entities/User";
const userRepository = getRepository(User); // 获取实体仓库
const allUsers = await userRepository.find(); // 获取所有用户
const user = await userRepository.findOne({ name: "Alice" }); // 根据条件获取一个用户
const youngUsers = await userRepository.find({ where: { age: MoreThan(18) } }); // 获取年龄大于18岁的所有用户
在上述代码中,userRepository.find()
方法用于查询所有用户,userRepository.findOne()
方法用于获取符合条件的第一个用户,userRepository.find({ where: { age: MoreThan(18) } })
方法用于获取年龄大于18岁的所有用户。
import { getRepository } from "typeorm";
import { User } from "../entities/User";
const userRepository = getRepository(User); // 获取实体仓库
const user = await userRepository.findOne({ name: "Alice" }); // 获取要更新的用户
user.age = 20;
await userRepository.save(user); // 更新用户的年龄
在上述代码中,我们首先使用userRepository.findOne()
方法获取要更新的用户,然后修改其属性值,并保存到数据库中。
import { getRepository } from "typeorm";
import { User } from "../entities/User";
const userRepository = getRepository(User); // 获取实体仓库
const usersToDelete = await userRepository.find({ age: 30 }); // 获取所有年龄为30的用户
await userRepository.remove(usersToDelete); // 删除这些用户
在上述代码中,我们首先使用userRepository.find()
方法获取所有要删除的用户,然后调用userRepository.remove()
方法删除它们。
除了基本的CRUD操作,TypeORM还提供了一些高级查询功能,例如关系查询,原生查询等。
在TypeORM中,可以使用@ManyToOne()
、@OneToMany()
等装饰器来定义实体之间的关系,并使用leftJoinAndSelect()
、innerJoinAndSelect()
等方法来查询关联的实体。
例如,下面是一个使用@ManyToOne()
关系的Order实体:
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
import { User } from "./User";
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne(() => User, user => user.orders)
user: User;
}
在上述代码中,我们使用@ManyToOne(() => User, user => user.orders)
装饰器定义了一个ManyToOne关系,表示一个Order只属于一个User。
查询Order实体时,可以使用leftJoinAndSelect()
方法关联User实体:
import { getRepository } from "typeorm";
import { Order } from "../entities/Order";
const orderRepository = getRepository(Order); // 获取实体仓库
const ordersWithUser = await orderRepository.createQueryBuilder("order")
.leftJoinAndSelect("order.user", "user")
.getMany(); // 获取所有订单,并关联用户信息
上述代码中,我们使用createQueryBuilder()
方法创建查询构建器,并使用leftJoinAndSelect()
方法关联了User实体。
TypeORM还支持原生SQL查询,可以使用query()
方法执行原生SQL查询。例如:
import { getManager } from "typeorm";
const query = "SELECT * FROM users WHERE age > :age";
const users = await getManager().query(query, { age: 18 });
上述代码中,我们使用了getManager().query()
方法执行了一条原生SQL查询,查询所有年龄大于18的用户。
本教程介绍了TypeORM的安装、配置、实体、增删改查和高级查询等基本操作,希望能对初学者有所帮助。TypeORM的文档非常详细,可以在https://typeorm.io/#/获取更多信息。