前言
最近越来越多听到这玩意了,试玩下。看了下介绍,有点叼,一个orm居然支持各种主流数据库。
安装
npm install typeorm -g
生成项目
typeorm init --name MyProject --database mysql
配置文件
{
"type": "mysql", // 选用的数据库
"host": "localhost", // 数据库地址
"port": 3306, // 数据库端口
"username": "test", // 数据库用户名
"password": "test", // 数据库密码
"database": "test", // 数据库
"synchronize": true, // 是否同步true表示会自动将src/entity里面定义的数据模块同步到数据库生成数据表(已经存在的表的时候再运行会报错)
"dropSchema": true, // 删除数据库中的表
"logging": false, // 是否打印日志,执行sql语句时候输出原生sql,也可以配置成一个数组["query", "error", "schema"]指定sql的执行类型
"charset": "utf8mb4", // 编码
"timezone": "local", // 时区,默认本地,也可以写"+8"
"entityPrefix": "", // 给此数据库连接上的所有表(或集合)加的前缀。
"entities": [ // 定义TypeORM需要查找的数据模型的,可以定义多个
"src/entity/**/*.ts"
],
"migrations": [ // 数据迁移文件生成的地方
"src/migration/**/*.ts"
],
"subscribers": [ // 订阅(用的少)
"src/subscriber/**/*.ts"
],
"cli": { // 数据迁移工具使用的
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
实体类
import { Entity
, PrimaryGeneratedColumn
, Column
, CreateDateColumn
, UpdateDateColumn
} from "typeorm";
@
Entity({ name
: 'user' })
export class User {
@
PrimaryGeneratedColumn({
type: 'int',
name
: 'id',
comment
: '主键id'
})
id
: number;
@
Column({
type: 'varchar',
nullable
: false,
length
: 50,
unique
: true,
name
: 'username',
comment
: '用户名'
})
username
: string;
@
Column({
type: 'varchar',
nullable
: false,
length
: 100,
comment
: '密码'
})
password
: string;
@
Column('tinyint', {
nullable
: false,
default: () => 0,
name
: 'is_del',
comment
: '是否删除,1表示删除,0表示正常'
})
isDel
: number;
@
CreateDateColumn({
type: 'timestamp',
nullable
: false,
name
: 'created_at',
comment
: '创建时间'
})
createdAt
: Date
;
@
UpdateDateColumn({
type: 'timestamp',
nullable
: false,
name
: 'updated_at',
comment
: '更新时间',
})
updateAt
: Date
;
}
关于@Entity()中可扩充的参数 name配置映射到数据库表名,如果不指定会以实体类名字创建数据表 orderBy排序方式(一般不用) engine引擎(一般不用) database数据库(一般不用,除非多个数据库的时候)
不管是使用@PrimaryGeneratedColumn()、@Column()等装饰器装饰字段的我们都叫字段装饰器 type配置字段类型,在mysql中字符类型可能是char、varchar、text,数字类型可能是int、tinyint,小数类型可能是float、double、decimal(10,2)等 name真正映射到mysql数据库中字段名字,如果不指定会默认以对象的字段为名字(建议都指定) length长度,比如在mysql中字段为varchar的时候指定字段长度 nullable在mysql中字段是否可以为NULL值,默认为false select改字段是否可以被查询出来(针对使用typeORM的查寻操作,不针对你使用原生SQL语句操作),默认为true表示可以被查询出来 default默认值,比如插入数据的时候,没传递该字段的值,就默认一个值 unique是否唯一约束 comment备注该字段是做什么的(建议都写上,方便阅读) enum枚举类型 array该列是否以数组
增删改查
新增 3种方式
import "reflect-metadata";
import { createConnection
} from "typeorm";
import { User
} from "./entity/User";
createConnection().then(async connection
=> {
const user
= new User()
user
.username
= '张三';
user
.password
= '123456';
connection
.manager
.save(user
).then(user
=> {
console.log('插入成功', user
);
});
}).catch(error
=> console.log(error
));
createConnection().then(async connection
=> {
const user
= new User();
user
.username
= '李四';
user
.password
= '123456';
const result
= await connection
.manager
.save(user
);
console.log('插入结果', result
);
}).catch(error
=> console.log(error
));
createConnection().then(async connection
=> {
const user
= new User();
user
.username
= '王五';
user
.password
= '123456';
const userRepository
= connection
.getRepository(User
);
const result
= await userRepository
.save(user
);
console.log(result
);
}).catch(error
=> console.log(error
));
删除数据
createConnection().then(async connection
=> {
const userRepository
= connection
.getRepository(User
);
const user
= await userRepository
.findOne(1);
await userRepository
.remove(user
);
}).catch(error
=> console.log(error
));
修改数据
const userRepository
= connection
.getRepository(User
);
const user
= await userRepository
.findOne(2);
user
.password
= '23456';
await userRepository
.save(user
);
另外这个配置,上有个同步时是建表的 ,保持开启就行。