找回密码
 立即注册
首页 业界区 业界 在Vona ORM中实现多数据库/多数据源

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

轧岔 2025-9-24 11:02:11
在Vona ORM中实现多数据库/多数据源非常直观、简便。下面以 Model User/Order 为例,通过查询用户的订单列表,来演示多数据库/多数据源的使用方法
准备Models

先准备两个 Models:User/Order

  • Model Order
  1. @Model({
  2.   entity: EntityOrder,
  3. })
  4. class ModelOrder{}
复制代码

  • 需要指定ModelOrder关联的Entity,限于篇幅,EntityOrder代码从略

  • Model User
  1. @Model({
  2.   entity: EntityUser,
  3.   relations: {
  4.     orders: $relation.hasMany(() => ModelOrder, 'userId'),
  5.   },
  6. })
  7. class ModelUser {}
复制代码

  • 在ModelUser中定义1:n关系: orders
查询数据

然后查询用户的订单列表
  1. class ServiceOrder {
  2.   async selectUserOrders() {
  3.     const userId = 1;
  4.     const userAndOrders = await this.scope.model.user.get(
  5.       {
  6.         id: userId,
  7.       },
  8.       {
  9.         include: {
  10.           orders: true,
  11.         },
  12.       },
  13.     );
  14.   }
  15. }  
复制代码
到目前为止,使用系统默认数据源查询到了userId=1的用户信息,和该用户的所有订单列表
创建多数据源

接下来,创建两个数据源:user-pg和order-mysql
1. 添加数据源的类型定义


  • 在 VSCode 中,通过右键菜单Vona Init/Types在模块中创建类型文件
  • 然后在类型文件中添加类型定义
{module path}/src/types/index.ts
  1. declare module 'vona-module-a-orm' {
  2.   export interface IDatabaseClientRecord {
  3.     'user-pg': never;
  4.     'order-mysql': never;
  5.   }
  6. }
复制代码

  • IDatabaseClientRecord是模块vona-module-a-orm提供的接口类型。在这里通过接口合并的机制来添加新的数据源类型
2. 数据源配置

在项目的App config文件中定义数据源的配置信息。由于前面已经添加了数据源类型,在App config文件中就可以享受完整的类型提示
src/backend/config/config/config.ts
  1. // database
  2. config.database = {
  3.   clients: {
  4.     'user-pg': {
  5.       client: 'pg',
  6.       connection: {
  7.         host: '127.0.0.1',
  8.         port: 5432,
  9.         user: 'postgres',
  10.         password: '',
  11.         database: 'user-xxx',
  12.       },
  13.     },
  14.     'order-mysql': {
  15.       client: 'mysql2',
  16.       connection: {
  17.         host: '127.0.0.1',
  18.         port: 3306,
  19.         user: 'root',
  20.         password: '',
  21.         database: 'order-xxx',
  22.       },
  23.     },
  24.   },
  25. };
复制代码

  • user-pg: 使用数据库方言:pg
  • order-mysql: 使用数据库方言:mysql2
使用数据源:动态方式

可以在代码中动态使用数据源:
  1. class ServiceOrder {
  2.   async selectUserOrders() {
  3.     const userId = 1;
  4. +   const modelUser = this.scope.model.user.newInstance('user-pg');
  5.     const userAndOrders = await modelUser.get(
  6.       {
  7.         id: userId,
  8.       },
  9.       {
  10.         include: {
  11.           orders: true,
  12.         },
  13.       },
  14.     );
  15.   }
  16. }  
复制代码

  • newInstance: 传入要使用的数据源,返回新的 Model 实例
到目前为止,使用数据源user-pg查询用户信息,使用系统默认数据源查询订单列表
使用数据源:Relation动态选项

可以在 relation 选项中动态指定数据源:
  1. class ServiceOrder {
  2.   async selectUserOrders() {
  3.     const userId = 1;
  4.     const modelUser = this.scope.model.user.newInstance('user-pg');
  5.     const userAndOrders = await modelUser.get(
  6.       {
  7.         id: userId,
  8.       },
  9.       {
  10.         include: {
  11.           orders: {
  12. +           meta: {
  13. +             client: 'order-mysql',
  14. +           },
  15.           },
  16.         },
  17.       },
  18.     );
  19.   }
  20. }  
复制代码

  • meta.client: 指定 relation orders要使用的数据源
到目前为止,使用数据源user-pg查询用户信息,使用数据源order-mysql查询订单列表
使用数据源:Model配置

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

  • Model Order
  1. @Model({
  2.   entity: EntityOrder,
  3. + client: 'order-mysql',
  4. })
  5. class ModelOrder{}
复制代码

  • 在VonaJS框架中,可以非常方便的为@Model装饰器指定参数

  • Model User
  1. @Model({
  2.   entity: EntityUser,
  3. + client: 'user-pg',
  4.   relations: {
  5.     orders: $relation.hasMany(() => ModelOrder, 'userId'),
  6.   },
  7. })
  8. class ModelUser {}
复制代码

  • 查询数据
现在,又可以使用常规的方式查询用户的订单列表
  1. class ServiceOrder {
  2.   async selectUserOrders() {
  3.     const userId = 1;
  4.     const userAndOrders = await this.scope.model.user.get(
  5.       {
  6.         id: userId,
  7.       },
  8.       {
  9.         include: {
  10.           orders: true,
  11.         },
  12.       },
  13.     );
  14.   }
  15. }  
复制代码
使用数据源:App Config配置

也可以在 App config 中配置 Model options:
src/backend/config/config/config.ts
  1. // onions
  2. config.onions = {
  3.   model: {
  4.     'test-vona:user': {
  5.       client: 'user-pg',
  6.     },
  7.     'test-vona:order': {
  8.       client: 'order-mysql',
  9.     },
  10.   },
  11. };
复制代码

  • 在VonaJS框架中,可以在App Config文件中提供配置,用于覆盖对应Model的options配置
于是,也可以使用常规的方式查询用户的订单列表
使用数据源:Relation静态选项

也可以在定义 Relation 时指定静态选项:
  1. @Model({
  2.   entity: EntityUser,
  3.   client: 'user-pg',
  4.   relations: {
  5.     orders: $relation.hasMany(() => ModelOrder, 'userId', {
  6. +     meta: {
  7. +       client: 'order-mysql',
  8. +     },
  9.     }),
  10.   },
  11. })
  12. class ModelUser {}
复制代码
同样,也可以使用常规的方式查询用户的订单列表
Vona ORM已开源:github.com/vonajs/vona

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册