TypeORM是一个基于JS的ORM框架,支持MySQL、SQLite、PgSQL、MSSQL、Oracle、MongoDB等多种数据库,可以运行在服务端如nodejs上,也可以运行在C端上(如React-native、Electron、Expo、Cordova),甚至在Browser里。
npm install typeorm -g
--name是创建的目录名称,--database是使用哪种数据库,可以用下列数据库:mysql
,mariadb
,postgres
,sqlite
,mssql
,oracle
,mongodb
,cordova
,react-native
,expo
,nativescript
typeorm init --name typeorm-1 --database sqlite
生成的目录结构如下:
npm start
运行结果:
demo代码主要演示了save和find两个方法,对应了sql里的insert和select。
为方便调试可以将logging打开,编辑data-source.ts文件:
将官方示例改造成async/await形式:
(async () => {
await AppDataSource.initialize();
const db = AppDataSource.manager;
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.age = 25
db.save(user);
const users = await db.find(User);
console.log("Loaded users: ", users)
})();
执行输出:
下面是demo里提供的entity/User.ts文件:
每个实体需要用@Entity()来标记。typeorm默认使用实体名称作为表名,如果需要指定表名,如@Entity("t_user")
普通字段是 @Column()
主键是 @PrimaryColumn(),如果一个表有多个键组成主键,则在多个字段里使用@PrimaryColumn()即可
自增id主键可以用 @PrimaryGeneratedColumn(),也可以用 @PrimaryGeneratedColumn("uuid") 来生成uuid
另外还有两个比较实用的特殊键,@CreateDateColumn() 和 @UpdateDateColumn() 作为数据的创建时间和最后更新时间。
指定列类型的方式:@Column("int") 或 @Column({ type:"int"})
更多参数:
@Column({
type: "varchar",
length: 150,
unique: true,
// ...
})
不同数据库的列类型,可以参考手册:https://typeorm.bootcss.com/entities#%E5%88%97%E7%B1%BB%E5%9E%8B
simple-array可以自动将列转成数组
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column("simple-array")
names: string[];
}
const user = new User();
user.id = 1;
user.names = ["Alexander", "Alex", "Sasha", "Shurik"];
db.save(user);
simple-json可以自动将列转成json
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column("simple-json")
profile: { name: string; nickname: string };
}
const user = new User();
user.id = 1;
user.profile = { name: "John", nickname: "Malkovich" };
db.save(user);
要使用Active Record模式,需要先将tsconfig.json里的 "target": "es5" 改为 es6,否则会报错(TypeError: Class constructor BaseEntity cannot be invoked without 'new')
另外,实体还必须extends BaseEntity才能支持extends BaseEntity。
(async () => {
await AppDataSource.initialize();
//create or update
const user = new User();
user.id = 1;
user.firstName = 'tiger';
user.lastName = 'woods';
user.age = 33;
await user.save();
//删除
user.id = 1;
await user.remove();
})();
执行输出:
(async () => {
await AppDataSource.initialize();
const userRepo = AppDataSource.getRepository(User);
const total = await userRepo.count();
console.log('total', total);
const user = await userRepo.find({where:{id:4}});
console.log('user', user);
})();
关系可以帮忙我们精简多个相关表的操作,免除繁琐的逻辑。
以最简单的一对一为例:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
gender: string;
@Column()
photo: string;
}
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm";
import { Profile } from "./Profile";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(() => Profile)
@JoinColumn()
profile: Profile;
}
这个示例会生成以下的表结构:
+-------------+--------------+----------------------------+
| profile |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| gender | varchar(255) | |
| photo | varchar(255) | |
+-------------+--------------+----------------------------+
+-------------+--------------+----------------------------+
| user |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| name | varchar(255) | |
| profileId | int(11) | FOREIGN KEY |
+-------------+--------------+----------------------------+
保存方法:
const profile = new Profile();
profile.gender = "male";
profile.photo = "me.jpg";
await db.save(profile);
const user = new User();
user.name = "Joe Smith";
user.profile = profile; //连接两个表
await db.save(user);
查询方法:
const userRepository = connection.getRepository(User);
const users = await userRepository.find({ relations: ["profile"] });
query builder可以用链式调用来执行SQL,方便且优雅。
await db.createQueryBuilder().
delete().
from(User).
where("age < :age", {age:5}).
execute();
await db.createQueryBuilder().
select("firstName,lastName").
from(User, "u").
where("u.id = :id", {id:1}).
getOne();
输出结果:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。