在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

在Vona ORM中实现多数据库/多数据源的更多相关文章

  1. Spring Boot中使用PostgreSQL数据库

    在如今的关系型数据库中,有两个开源产品是你必须知道的.其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的.而今天 ...

  2. 理解ORM的前提:数据库中的范式和约束

    理解ORM的前提:数据库中的范式和约束 一.数据库中的范式: 范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出 ...

  3. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

  4. SQLAlchemy01 /SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中

    SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...

  5. SQLAlchemy(一):SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中

    SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...

  6. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  7. Atitit  基于meta的orm,提升加速数据库相关应用的开发

    Atitit  基于meta的orm,提升加速数据库相关应用的开发 1.1. Overview概论1 1.2. Function & Feature功能特性1 1.2.1. meta api2 ...

  8. C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

    反射以及Attribute在ORM中的应用 一. 反射什么是反射?简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等.反射有什么用呢?反射不但让你在运行 ...

  9. 【Spring】如何在单个Boot应用中配置多数据库?

    原创 BOOT 为什么需要多数据库? 默认情况下,Spring Boot使用的是单数据库配置(通过spring.datasource.*配置具体数据库连接信息).对于绝大多数Spring Boot应用 ...

  10. Django ORM 中的批量操作

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

随机推荐

  1. 前端开发系列126-进阶篇之Rollup

    本文简单介绍类库打包工具 rollup . Rollup 是一款 JavaScript 模块打包器,可以将多个简单的js代码文件编译成一份复杂的js代码文件,需要注意的是 Rollup 主要用于Jav ...

  2. 前端开发系列083-Node篇之http

    本文对Node的内置模块http进行介绍,包括该模块的基本情况和简单使用. 一.模块简介 http是Node的内置核心模块,包含了对HTTP处理的封装. 在Nodejs文件中可以直接在代码里通过var ...

  3. 谷云科技RestCloud全面接入DeepSeek 开启智能新时代

    在数字化转型的浪潮中,谷云科技始终走在数据集成与智能应用领域的前沿.近期,随着 DeepSeek 的火爆出圈,谷云科技紧跟技术趋势,对旗下两大核心产品 -- 数据集成软件 ETLCloud 和 AI ...

  4. POLIR-Organization-Gov.: 人类社会的 "善恶永存"、"权利斗争" 书写在"历史" 与 "法律法规" 上

    POLIR-Organization-Gov.: 一.人类社会的 "善恶永存"."权利斗争" 书写在"历史" 与 "法律法规&qu ...

  5. Living-Energy/Water-地热/地冷-:砂岩地层U型管深井闭环地热评估

    Living-Energy/Water-地热/地冷-:砂岩地层U型管深井闭环地热评估 深井钻机: https://www.xcmg.com/product/pro-list.htm?catId=100 ...

  6. void swap(double& val1,double& val2); 这是什么意思

    void swap(double& val1,double& val2);这是什么意思? 定义了一个叫做 swap 的函数,它接受两个双精度数的引用作为参数 在 C++ 中,& ...

  7. babylon.js 学习笔记(2)

    如何在网页中嵌入设计好的模型? 接上回继续,我们设计好精美的模型后,最终总要展示给客户,比如利用playground画了1个方块: const createScene = () => { con ...

  8. 推荐6个专为新手小白设计的AI开源项目,非常牛逼!

    1.One Small Step One Small Step是一个技术科普教程项目,专注于解释有趣且前沿的技术概念和原理.项目中的每篇文章都设计为在5分钟内阅读完成,适合对新技术感兴趣的读者快速入门 ...

  9. html中替换meta标签内容

    应用场景:多个页面中使用同一个meta,为了减少重复工作和修改方便,通过引入js动态改变. 实现方法 通过js取出meta内容,替换即可. head.js内容如下 $(function () { fu ...

  10. 联想3650 X型号服务器的raid划分

    1进入bios,点击System setting选项: 2进去后,点击Storage选项: 3进去后,只有一个选项,就是AVAGO MegaRAID<ServerRAID M5210> C ...