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

news/2025/9/24 10:13:38/文章来源:https://www.cnblogs.com/zhennann/p/19108669

在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.mzph.cn/news/915537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发工程师是什么意思重庆大学建设管理与房地产学院网站

什么是token?token是一个用户自定义的任意字符串,目前开发中,token都是在服务端生成并且token的值会保存到服务器后台。只有服务器和客户端知道这个字符串,于是,这个token就成了两者之间的秘钥,它可以让服务…

实用指南:python全栈-数据可视化

实用指南:python全栈-数据可视化pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

sql over()函数使用

起因 最近我在推送数据到中间库时,由于源表比较大,所以采用了基于主键ID的分批推送,于是就有了如下脚本: -- 第一步,推送数据 insert into Interconnect..Steps SELECT TOP (@batch_size) StepID, {其他业务字段}…

小柏实战学习Liunx(图文教程三十二)

小柏实战学习Liunx(图文教程三十二)本节课主题:linux(CentOS Stream 9 64bit)安装Docker,LangBot,NapCatQQ 前言:一定要知道每一个命令是啥意思,并且要学会看报错信息,学会使用AI。 (centos7 注定要被淘汰了,公司已经…

绵竹网站制作狗和女主人做爰网站

在Docker中搭建Redis主从架构非常方便,下面是一个示例,演示一下如何使用Docker Compose搭建一个Redis主从复制环境。首先,确保我们本地环境已经安装了Docker和Docker Compose。 我这里使用OrbStack替代了Docker desktop。 1. 创建一个名为r…

Git回退版本 reset、revert、read-tree、restore

一、git reset git reset [--soft | --mixed | --hard] [目标版本][目标版本]:使用git log获取目标版本的SHA 使用git reflog获取目标版本的短SHA HEAD: 当前版本 HEAD^:上一个版本 HEAD^^:上上一个版本 HEAD~数字…

详细介绍:LeetCode 240. 搜索二维矩阵 II

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Avalonia 背景颜色Transparent在用户界面设计中对悬浮效果影响的总结

Transparent 对悬浮效果的影响 在用户界面设计中,透明(Transparent)属性常用于控制组件如何处理鼠标事件及视觉呈现。特别是在Avalonia UI框架中,设置控件的背景色为透明对实现交互效果如悬停反馈有重要影响。 1. …

飞书 燕千云焕新上线,飞书用户即刻试用ITSM工具

飞书x燕千云ITSM,让IT服务再焕新当飞书的协作流畅性,与燕千云智能服务流平台的专业IT服务能力相遇,飞书用户在无需改变使用习惯的情况下,也能获得更智能、更高效、更简便的企业IT服务新体验。深度集成飞书生态,即…

如果使用微软 Azure 托管的 OpenAI 服务

使用微软 Azure 托管的 OpenAI 服务时,LangChain4j 提供了专门的集成支持,通过 langchain4j-azure-openai 模块可以轻松实现交互。以下是详细的使用指南: 1. 准备工作创建 Azure OpenAI 资源:在 Azure 门户 中创建…

西樵网站建设公司电脑做apk的网站h5

Windows Server 2012姗姗来迟,最新的Hyper-V 3给我们带来更多的惊喜,后续三篇博文和大家共同学习虚拟机CPU竞争机制。 第一部分:分配给虚拟机的CPU资源 第二部分:限定虚拟机可用的CPU利用率 第三部分:争夺CPU资源优先级…

Alibaba Cloud Linux与 RHEL/CentOS版本对应关系 - 实践

Alibaba Cloud Linux与 RHEL/CentOS版本对应关系 - 实践2025-09-24 09:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

免费表格模板网站建设视频网站的视频源

ArrayList 基于数组实现,无容量的限制。 在执行插入元素时可能要扩容,在删除元素时并不会减小数组的容量,在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找。 是非线程安全的。 注意点: &#xff08…

象山县城乡建设局网站网站主页图片怎么换

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:多目标优化算法 多目标优化 分别求权重方法 算法流程: 两个目标权重求和,化为单目标函数,然后求解最优值 min ⁡ x ∑ i 1 m w i F i ( x ) s.…

OpenCV:人脸识别实战,3 种算法(LBPH/EigenFaces/FisherFaces)代码详解 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:Playwright录制时的高亮实现机制分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

什么是文件外发审批?主要有哪几种关键流程?

文件外发审批是企业进行外部文档传输时不可或缺的一部分。它涵盖了从申请发起到文档送达后反馈的一系列环节。在申请阶段,员工需要利用Ftrans B2B企业间文件安全交换系统,准确填写申请信息以确保透明度和合规性。随后…

VPX处理板设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 C6678板卡, XC7VX690T板卡, VPX处理板

基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 一、概述本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V6…

Python入门—Mac如何搭建Python开发环境?

Python入门—Mac如何搭建Python开发环境?Python入门—Mac如何搭建Python开发环境?编程玉子 ​关注她14 人赞同了该文章随着Numpy、Scipy、Matplotlib和Pandas等众多程序库的开发,python在数据分析、数据挖掘、海量数…

织梦做网站简单吗高端网站建设公司排名

1.概述 封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。 要访问该类的代码和数据,必须通过严格的接口控制…