Nest恶补Typeorm - Typeorm快速入门学习(结合typescript)

TypeScript 同时被 3 个专栏收录
22 篇文章 0 订阅
8 篇文章 0 订阅
2 篇文章 0 订阅

Typeorm快速入门学习

简单粗暴,主要和mongoose差不多的使用功能,快速学习

官方githubAPI(点击跳转)
官方API(点击跳转)

1.安装(和官方一样使用mysql,其它数据库请安装其它的依赖包)

npm install typeorm reflect-metadata @types/node mysql --save

2.TypeScript编译器版本3.3或更高版本,并且您已启用以下设置tsconfig.json

“ emitDecoratorMetadata ”: true,
“ experimentalDecorators ”: true

3.连接到mysql数据库(单个数据库连接)

import {createConnection} from "typeorm";
try{
	const connection = await createConnection({
	    type: "mysql", // 数据库类型
	    host: "localhost", // host,本地localhost/127.0.0.1
	    port: 3306, // 数据库端口号,mysql默认3306
	    username: "test", // 登录数据库的账号
	    password: "test", // 登录数据库的密码
	    database: "test", // mysql中的test数据库
	    entities: [__dirname + "/entity/*{.js,.ts}"], //表示扫描到的实例类的位置,src下面的/entity文件夹下面的任意.ts或.js文件
   		synchronize: true // 是否同步
	});
}catch(error){//连接出错
	console.log(error);
}
3.1在项目根目录(和package.json同级的地方)创建ormconfig.json。抽离出上面的连接对象放到该文件中
{
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "test",
   "password": "test",
   "database": "test",
   "entities": ["src/entity/*{.js,.ts}"],
   "synchronize": true
}
然后连接就不需要传递对象了,typeORM会在根目录下查找ormconfig.json文件,并连接
import {createConnection} from "typeorm";
try{
	const connection = await createConnection();
}catch(error){//连接出错
	console.log(error);
}
如果是多个数据库连接,就使用数组,存放一个个上面ormconfig.json那样的对象
[{
    name: "db1Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db1",
    entities: ["src/entity/*{.js,.ts}"],
    synchronize: true
}, {
    name: "db2Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db2",
    entities: ["src/entity/*{.js,.ts}"],
    synchronize: true
}]
//连接,通过name连接
await createConnection('db1Connection');
await createConnection('db2Connection');

4.创建实例类

import { Entity, Column, PrimaryColumn, Double} from "typeorm";
@Entity()
export class Photo {
    @PrimaryColumn()
    id: number;
    @Column({
        length: 100,
        default: '姓',
        charset: 'utf-8',
        readonly: false,
        type: 'string',
        unique: true,
        insert: true,
        primary: false,
        select: true,
        name: 'name',
        nullable: false,
    })
    name: string;
    @Column('text')
    description: string;
    @Column(type => String)
    filename: string;
    @Column(type => Double)
    views: number;
    @Column()
    isPublished: boolean;
}
Entity装饰器,表示这个类是一个实例类,和数据库的表字段一致,便于修改删除等操作
Column装饰器,表示这是一列,就是一个数据库字段
PrimaryColumn装饰器,就是主列,相当于mysql的主键
PrimaryGeneratedColumn:装饰器,也就是自动生成的主键,相当于mysql的自增长主键
Entity装饰的类相当于mongodb数据库的一个文档,Column装饰的属性等于文档里的一个字段
Column装饰器传参:

1.传递一个字符串表示类型,比如text类型,mysql
2.传递一个回调函数,type => Double,表示这是一个double类型的字段
3.传递一个对象,对象参数有许多,介绍几个

{
        length: 100, // 长度设置,mysql的int类型没有长度,
        default: '姓', // 默认值
        charset: 'utf-8', // 编码格式
        readonly: false, // 是否只读
        type: 'string', // 类型,string,text,time,int,double等等等
        unique: true, // 是否是唯一的
        insert: true, // 是否可写
        primary: false, // 是否是主键
        select: true, // 是否可查询
        name: 'name', // 对应数据库字段名
        nullable: false, // 是否可以为空,false表示不为空
    }

5.简单连接使用增加一列

import {createConnection} from "typeorm";
try{
	const connection = await createConnection();
	//增加
	let photo = new Photo(); // 创建一个对象
    photo.name = "Me and Bears"; // 给对象注入参数
    photo.description = "I am near polar bears";
    photo.filename = "photo-with-bears.jpg";
    photo.views = 1;
    photo.isPublished = true;

    await connection.manager.save(photo); // 调用manager管理属性,然后.save(对象),增加一列
    // 或者使用
    // let photoRepository = connection.getRepository(Photo);
    // await photoRepository.save(photo);
    console.log("Photo has been saved. Photo id is", photo.id);

}catch(error){//连接出错
	console.log(error);
}
getRepository:传入一个类,表示连接到这个表,然后save添加到这个表中

6.删除,修改,查询

// 1.查询全局,传入类
 const savedPhotos = await connection.manager.find(Photo);
 console.log("All photos from the db: ", savedPhotos);
// or 查询一个,传入条件
let photoRepository = connection.getRepository(Photo);
let meAndBearsPhoto = await photoRepository.findOne({ name: "Me and Bears" });
console.log("Me and Bears photo from the db: ", meAndBearsPhoto);
// 查询全部并返回总条数
let [allPhotos, photosCount] = await photoRepository.findAndCount();
//返回的数组,第一个是全部数据,第二个是总条数
// 2.查询后修改插回去
meAndBearsPhoto.name = "Me, my friends and polar bears";
await photoRepository.save(photoToUpdate);
// 3.查询后删除
await photoRepository.remove(meAndBearsPhoto); 

7.getConnection、getManager、getRepository

getConnection:获取连接的数据库

import {getConnection} from "typeorm";
import {User} from "./entity/User";

const entityManager = getConnection().manager;
const photo = await entityManager.findOne(Photo, 1);
photo.name = "Umed";
await entityManager.save(photo);

getManager:获取连接管理,

import {getManager} from "typeorm";
import {User} from "./entity/User";

const entityManager = getManager();
const photo = await entityManager.findOne(Photo, 1);
photo.name = "Umed";
await entityManager.save(photo);

getRepository:获取连接成功的存储库,接收一个通过Entity装饰的类参数

import {getRepository} from "typeorm";
import {User} from "./entity/User";

const userRepository = getRepository(Photo); // getConnection().getRepository() or getManager().getRepository()
const photo = await userRepository.findOne(1);
photo.name = "Umed";
await userRepository.save(photo);

7.OneToOne,OneToMany,ManyToOne,ManyToMany(多表关联的一对一,一对多,多对一,多对多的关系)

import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from "typeorm";
import {Photo} from "./Photo";

@Entity()
export class PhotoMetadata {

    /* ... other columns */

    @OneToOne(type => Photo, photo => photo.metadata)
    @JoinColumn()
    photo: Photo;
}
import {Entity, Column, PrimaryGeneratedColumn, OneToOne} from "typeorm";
import {PhotoMetadata} from "./PhotoMetadata";

@Entity()
export class Photo {

    /* ... other columns */

    @OneToOne(type => PhotoMetadata, photoMetadata => photoMetadata.photo, {
        cascade: true,
    })
    metadata: PhotoMetadata;
}
JoinColumn表示连接另外一个表,OneToOne表示一对一,第一个回调函数是关联的表,第二个回调函数是对面表的字段对应这个实体类

cascade:是否相关联的,为true的话,表示只需要改变整个Photo类,对应关联的PhotoMetadata类的表也会对应改变

let photoRepository = connection.getRepository(Photo);
let photos = await photoRepository.find({ relations: ["metadata"] });
//查询全部的photo,并连接到PhotoMetadata数据库,把metadata字段换成那个类对应的表字段
其它的多对多,多对一也差不多这样使用

8.查询生成器

const photos = getRepository(Photo) 
	.createQueryBuilder("photo") // 创建查询生成器,生成photo对象
	.innerJoinAndSelect("photo.metadata", "metadata") // photo.metadata 关联 metadata属性,并查询
	.getMany(); // 最后查询出全部
本次是快速入门,需要了解更清楚的可以进入官方API(单击跳转)
  • 2
    点赞
  • 5
    评论
  • 11
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 5 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Mack Liu

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值