当前位置: 首页 > news >正文

在Vona ORM中实现多数据库/多数据源

在Vona ORM中实现多数据库/多数据源非常直观、简便。下面以 Model User/Order 为例,通过查询用户的订单列表,来演示多数据库/多数据源的使用方法

准备Models

先准备两个 Models:User/Order

  1. Model Order
@Model({entity: EntityOrder,
})
class ModelOrder{}
  • 需要指定ModelOrder关联的Entity,限于篇幅,EntityOrder代码从略
  1. Model User
@Model({entity: EntityUser,relations: {orders: $relation.hasMany(() => ModelOrder, 'userId'),},
})
class ModelUser {}
  • 在ModelUser中定义1:n关系: orders

查询数据

然后查询用户的订单列表

class ServiceOrder {async selectUserOrders() {const userId = 1;const userAndOrders = await this.scope.model.user.get({id: userId,},{include: {orders: true,},},);}
}  

到目前为止,使用系统默认数据源查询到了userId=1的用户信息,和该用户的所有订单列表

创建多数据源

接下来,创建两个数据源:user-pgorder-mysql

1. 添加数据源的类型定义

  • 在 VSCode 中,通过右键菜单Vona Init/Types在模块中创建类型文件

  • 然后在类型文件中添加类型定义

{module path}/src/types/index.ts

declare module 'vona-module-a-orm' {export interface IDatabaseClientRecord {'user-pg': never;'order-mysql': never;}
}
  • IDatabaseClientRecord是模块vona-module-a-orm提供的接口类型。在这里通过接口合并的机制来添加新的数据源类型

2. 数据源配置

在项目的App config文件中定义数据源的配置信息。由于前面已经添加了数据源类型,在App config文件中就可以享受完整的类型提示

src/backend/config/config/config.ts

// database
config.database = {clients: {'user-pg': {client: 'pg',connection: {host: '127.0.0.1',port: 5432,user: 'postgres',password: '',database: 'user-xxx',},},'order-mysql': {client: 'mysql2',connection: {host: '127.0.0.1',port: 3306,user: 'root',password: '',database: 'order-xxx',},},},
};
  • user-pg: 使用数据库方言:pg
  • order-mysql: 使用数据库方言:mysql2

使用数据源:动态方式

可以在代码中动态使用数据源:

class ServiceOrder {async selectUserOrders() {const userId = 1;
+   const modelUser = this.scope.model.user.newInstance('user-pg');const userAndOrders = await modelUser.get({id: userId,},{include: {orders: true,},},);}
}  
  • newInstance: 传入要使用的数据源,返回新的 Model 实例

到目前为止,使用数据源user-pg查询用户信息,使用系统默认数据源查询订单列表

使用数据源:Relation动态选项

可以在 relation 选项中动态指定数据源:

class ServiceOrder {async selectUserOrders() {const userId = 1;const modelUser = this.scope.model.user.newInstance('user-pg');const userAndOrders = await modelUser.get({id: userId,},{include: {orders: {
+           meta: {
+             client: 'order-mysql',
+           },},},},);}
}  
  • meta.client: 指定 relation orders要使用的数据源

到目前为止,使用数据源user-pg查询用户信息,使用数据源order-mysql查询订单列表

使用数据源:Model配置

也可以直接在 Model 中配置数据源,从而简化查询代码

  1. Model Order
@Model({entity: EntityOrder,
+ client: 'order-mysql',
})
class ModelOrder{}
  • 在VonaJS框架中,可以非常方便的为@Model装饰器指定参数
  1. Model User
@Model({entity: EntityUser,
+ client: 'user-pg',relations: {orders: $relation.hasMany(() => ModelOrder, 'userId'),},
})
class ModelUser {}
  1. 查询数据

现在,又可以使用常规的方式查询用户的订单列表

class ServiceOrder {async selectUserOrders() {const userId = 1;const userAndOrders = await this.scope.model.user.get({id: userId,},{include: {orders: true,},},);}
}  

使用数据源:App Config配置

也可以在 App config 中配置 Model options:

src/backend/config/config/config.ts

// onions
config.onions = {model: {'test-vona:user': {client: 'user-pg',},'test-vona:order': {client: 'order-mysql',},},
};
  • 在VonaJS框架中,可以在App Config文件中提供配置,用于覆盖对应Model的options配置

于是,也可以使用常规的方式查询用户的订单列表

使用数据源:Relation静态选项

也可以在定义 Relation 时指定静态选项:

@Model({entity: EntityUser,client: 'user-pg',relations: {orders: $relation.hasMany(() => ModelOrder, 'userId', {
+     meta: {
+       client: 'order-mysql',
+     },}),},
})
class ModelUser {}

同样,也可以使用常规的方式查询用户的订单列表

Vona ORM已开源:github.com/vonajs/vona

http://www.hskmm.com/?act=detail&tid=15547

相关文章:

  • 实用指南:python全栈-数据可视化
  • sql over()函数使用
  • Git回退版本 reset、revert、read-tree、restore
  • Avalonia 背景颜色Transparent在用户界面设计中对悬浮效果影响的总结
  • 飞书 燕千云焕新上线,飞书用户即刻试用ITSM工具
  • 如果使用微软 Azure 托管的 OpenAI 服务
  • Python类
  • 什么是文件外发审批?主要有哪几种关键流程?
  • VPX处理板设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 C6678板卡, XC7VX690T板卡, VPX处理板
  • VitePress 添加友链界面
  • 跨网文件摆渡软件:企业数据安全高效传输的关键解决方案!
  • 洛谷题单指南-进阶数论-P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站) - 指南
  • c语言之自定义memcpy
  • 国产芯片处理板卡:7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡
  • 一文详解纷享销客CRM Agent平台3大核心能力(附应用场景与案例)
  • QOJ #5076. Prof. Pang and Ants 题解
  • 发现5个宝藏文件摆渡系统 2025年企业首选的摆渡方案是这个!
  • 漏洞挖掘实战:如何定制化模糊测试技术
  • nuxt3中使用pdfjs-dist实现pdf转换canvas实现浏览
  • 查看linux部署网站的TLS版本号
  • 【SpringBoot- Spring】学习
  • 基于Python+Vue开发的摄影网上预约管理系统源码+运行步骤
  • 【习题答案】《深入理解计算机系统(原书第三版)》
  • 深入解析:mosquitto求医之路(3):Docker安装也不好使
  • 在K8S中,在服务上线的时候Pod起不来怎么进行排查?
  • 在线教育软件开发的全流程解析与优化方案
  • 在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
  • 在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
  • 上海应用大学网课自动化学习脚本(基于Python selenium)代码重构为GUI界面 —— 技术笔记