tencent cloud

云函数

动态与公告
产品动态
产品公告
新手指引
产品简介
产品概述
相关概念
工作原理
产品优势
应用场景
相关产品
购买指南
计费概述
计费方式
计费项与计费方式
函数算力支持
免费额度
产品定价
计费示例
欠费与停服说明
快速入门
使用控制台创建一个事件函数
操作指南
配额管理
函数管理
Web 函数管理
日志管理
并发管理
触发器管理
函数 URL
自定义域名
版本管理
别名管理
权限管理
运行实例管理
插件管理
监控与告警管理
网络配置
层管理
执行配置
扩展存储管理
DNS 缓存配置
资源托管模式管理
近离线资源托管模式
工作流
触发器
触发器概述
触发器事件消息结构汇总
API 网关触发器
COS 触发器
CLS 触发器
定时触发器
CKafka 触发器
Apache Kafka 触发器
MQTT 触发器
触发器配置描述
MPS 触发器
CLB 触发器说明
云 API 触发器
开发指南
基本概念
测试云函数
环境变量
依赖安装
使用容器镜像
使用 Docker 安装依赖
错误类型与重试策略
死信队列
云函数接入数据库
自动化部署
云函数状态码
常见错误码解决方法
开发者工具
Serverless Web IDE
函数间调用 SDK
第三方工具
代码开发
Python
Node.js
Golang
PHP
Java
Custom Runtime
使用镜像部署函数
Web 框架部署
通过命令行完成框架部署
快速部署 Egg 框架
快速部署 Express 框架
快速部署 Flask 框架
快速部署 Koa 框架
快速部署 Laravel 框架
快速部署 Nestjs 框架
快速部署 Nextjs 框架
快速部署 Nuxtjs 框架
快速部署 Django 框架
实践教程
最佳实践概述
云产品联合解决方案
业务开发相关实践
实时音视频 TRTC
对象存储 COS
消息队列 CKafka
日志服务CLS
负载均衡 CLB
视频处理 MPS
内容分发网络 CDN
云数据仓库 PostgreSQL
云点播 VOD
短信 SMS
Elasticsearch Service
定时任务
视频处理
客户案例
腾讯在线教育
在线教育行业案例
游戏聊天系统
腾讯互娱国际(IEGG)
API 文档
History
Introduction
API Category
Making API Requests
Other APIs
Namespace APIs
Layer Management APIs
Async Event Management APIs
Trigger APIs
Function APIs
函数和层的状态说明
Data Types
Error Codes
SDK文档
常见问题
通用问题
Web 函数相关问题
计费相关问题
网络相关问题
日志相关问题
SCF 工具相关问题
事件处理相关问题
API 网关触发器相关问题
相关协议
Service Level Agreement
联系我们
词汇表

访问数据库

PDF
聚焦模式
字号
最后更新时间: 2024-04-22 17:54:01
Malagu 框架可以方便地集成第三方数据库操作相关的框架,例如 Sequelize、Typeorm 等。基于 Malagu 的组件机制,第三库扩展性更强,且支持属性配置,开箱即用。
目前,框架提供了对 Typeorm 库的集成,可以通过框架配置文件,配置数据库链接相关信息。另外,Malagu 框架是 Serverless First,框架在集成 Typeorm 时,对 Serverless 场景进行了最佳实践适配。同时借鉴了 Spring 事务管理机制,提供了无侵入式的事务管理,并支持事务的传播行为。

使用方法

1. 框架提供了一个内置模板 database-app ,执行以下命令可以快速初始化一个有关数据库操作的模板应用。
malagu init demo database-app
2. 初始化完成后,只需将数据库链接配置改成当前实际环境的配置。通过执行以下命令也可以在项目里直接安装 @malagu/typeorm 组件。
yarn add @malagu/typeorm
# 或者执行 npm i @malagu/typeorm

配置数据源链接

在 Malagu 中,数据源链接配置与 Typeorm 类似,只是配置形式和位置稍微不同。框架为使第三库的配置方式与框架组件的配置方式保持统一,框架在集成 Typeorm 时,将 Typeorm 的原有配置方式适配成了框架组件的配置方式。更多 Typeorm 数据源链接配置说明,请参见 Typeorm 官方文档
单数据源
多数据源
数据源链接名称如果未设置,则默认是 default。
# malagu.yml
backend:
malagu:
typeorm:
ormConfig:
- type: mysql
host: localhost
port: 3306
synchronize: true
username: root
password: root
database: test
为区分不同的数据源链接,需要为数据源链接设置名称,有且只有一个可以不设置名称,且该链接默认名称为 default。在使用 OrmContext 相关的 API 时,将会使用数据源链接名称。
# malagu.yml
backend:
malagu:
typeorm:
ormConfig:
- type: mysql
host: localhost
port: 3306
synchronize: true
username: root
password: root
database: test
- type: mysql
name: 'datasource2'
host: xxxx
port: 3306
synchronize: true
username: root
password: root
database: test

数据库操作

以下示例使用 rest 风格来实现 API。
说明:
您也可以使用 RPC 风格来实现,这两种两种风格类似。
import { Controller, Get, Param, Delete, Put, Post, Body } from '@malagu/mvc/lib/node';
import { Transactional, OrmContext } from '@malagu/typeorm/lib/node';
import { User } from './entity';

@Controller('users')
export class UserController {
@Get()
@Transactional({ readOnly: true })
list(): Promise<User[]> {
const repo = OrmContext.getRepository(User);
return repo.find();
}
@Get(':id')
@Transactional({ readOnly: true })
get(@Param('id') id: number): Promise<User | undefined> {
const repo = OrmContext.getRepository(User);
return repo.findOne(id);
}
@Delete(':id')
@Transactional()
async reomve(@Param('id') id: number): Promise<void> {
const repo = OrmContext.getRepository(User);
await repo.delete(id);
}
@Put()
@Transactional()
async modify(@Body() user: User): Promise<void> {
const repo = OrmContext.getRepository(User);
await repo.update(user.id, user);
}
@Post()
@Transactional()
create(@Body() user: User): Promise<User> {
const repo = OrmContext.getRepository(User);
return repo.save(user);
}
}

数据库上下文

在 Malagu 框架中,Typeorm 的事务托管至框架管理。框架提供了一个装饰器 @Transactional ,用于框架在执行方法前后如何开启、传播、提交和回滚事务。同时框架会将托管的 Entitymanager 对象放到数据库上下文中,方便在业务代码中使用。另外您也可以手动管理数据库事务和创建 EntityManager 对象。
数据库上下文基于请求上下文实现,因此数据库上下文也是请求级别。在数据库上下文中主要提供了获取 EntityManager 和 Repository 对象相关的方法:
export namespace OrmContext {
export function getEntityManager(name = DEFAULT_CONNECTION_NAME): EntityManager {
...
}
export function getRepository<Entity>(target: ObjectType<Entity>|EntitySchema<Entity>|string, name?: string): Repository<Entity> {
...
}
export function getTreeRepository<Entity>(target: ObjectType<Entity>|EntitySchema<Entity>|string, name?: string): TreeRepository<Entity> {
...
}
export function getMongoRepository<Entity>(target: ObjectType<Entity>|EntitySchema<Entity>|string, name?: string): MongoRepository<Entity> {
...
}
export function getCustomRepository<T>(customRepository: ObjectType<T>, name?: string): T {
...
}
export function pushEntityManager(name: string, entityManager: EntityManager): void {
...
}
export function popEntityManager(name: string): EntityManager | undefined {
...
}
}

事务管理

Malagu 框架提供了一个装饰器 @Transactional ,以声明的方式定义事务的行为,Malagu 框架根据装饰器声明决定事务的开启、传播、提交和回滚行为。

@Transactional

@Transactional 装饰器可以加在类和方法上,如果类和方法同时加上,最终的配置是使用方法的配置去合并类,且方法的配置优先级高于类上。装饰器配置选项如下:
export interface TransactionalOption {
name?: string; // 多数据源链接情况下,指定数据源链接名称,默认为 default
isolation?: IsolationLevel; // 数据库隔离级别
propagation?: Propagation; // 事务的传播行为,支持 Required 和 RequiresNew,默认为 Required
readOnly?: boolean; // 只读,不开启事务,默认为开启事务
}
示例如下:
@Put()
@Transactional()
async modify(@Body() user: User): Promise<void> {
const repo = OrmContext.getRepository(User);
await repo.update(user.id, user);
}

@Transactional 与 OrmContext

Malagu 框架根据装饰器的配置,在方法调用前开启事务(也可能不开启),并将 EntityManager 托管在 OrmContext 上下文中,通过 OrmContext 取到框架帮助开启过事务的 EntityManager,其中 Repository 是通过托管的 EntityManager 创建。为正确获取到 EntityManager,请确保装饰器配置的名称与通过 OrmContext 要获取的 EntityMananger 名称保持一致,不指定名称,则默认为 default。
方法执行后,框架根据方法的执行情况,自动决定事务是提交还是回滚,方法执行出现异常则回滚事务,否则提交事务。
当方法存在嵌套调用带 @Transactional 装饰器的方法,由事务传播行为的配置决定是复用上层方法的事务,还是重新开启新的事务。

数据库查询

数据库查询大部分情况无需开启事务,但建议最好在方式加上 @Transactional 装饰器,并将 readonly 配置为 true,让框架创建一个不开启事务的 EntityManager,保持代码风格统一。示例如下:
@Get()
@Transactional({ readOnly: true })
list(): Promise<User[]> {
const repo = OrmContext.getRepository(User);
return repo.find();
}

事务传播行为

事务传播行为决定事务在需要事务的不同方法之间如何传播,目前支持两种事务传播行为:
export enum Propagation {
Required, RequiresNew
}
Required:需要开启一个事务,如果上一层方法已经开启过事务,则复用上一个事务,否则开启一个新事务。
RequiresNew:无论上一层方法是否开启过事务,都将开启一个新事物。
注意:
事务在不同的方法传播的时候,请保证方法之间是同步调用的。示例如下:
...
@Transactional()
async foo(): Promise<void> {
...
await bar(); // 必须加上 await
}
....

...
@Transactional()
async bar(): Promise<void> {
...
}

绑定实体类

框架提供了一个方法 autoBindEntities 用于绑定实体类,该方法一般在模块入口文件里调用。方法包含以下两个参数:
entities:您定义的实体类。
name:您希望实体类与哪个数据源连接绑定,默认与 default 绑定。
export function autoBindEntities(entities: any, name = DEFAULT_CONNECTION_NAME) {
}
示例如下:
import { autoBindEntities } from '@malagu/typeorm';
import * as entities from './entity';
import { autoBind } from '@malagu/core';

autoBindEntities(entities);
export default autoBind();

工具类

工具
描述
DEFAULT_CONNECTION_NAME
默认数据库连接名称 default。
autoBindEntities
绑定实体类。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈