在Vona ORM中實現(xiàn)多數(shù)據(jù)庫/多數(shù)據(jù)源
在Vona ORM中實現(xiàn)多數(shù)據(jù)庫/多數(shù)據(jù)源非常直觀、簡便。下面以 Model User/Order 為例,通過查詢用戶的訂單列表,來演示多數(shù)據(jù)庫/多數(shù)據(jù)源的使用方法
準(zhǔn)備Models
先準(zhǔn)備兩個 Models:User/Order
- Model Order
@Model({
entity: EntityOrder,
})
class ModelOrder{}
- 需要指定ModelOrder關(guān)聯(lián)的Entity,限于篇幅,EntityOrder代碼從略
- Model User
@Model({
entity: EntityUser,
relations: {
orders: $relation.hasMany(() => ModelOrder, 'userId'),
},
})
class ModelUser {}
- 在ModelUser中定義
1:n關(guān)系:orders
查詢數(shù)據(jù)
然后查詢用戶的訂單列表
class ServiceOrder {
async selectUserOrders() {
const userId = 1;
const userAndOrders = await this.scope.model.user.get(
{
id: userId,
},
{
include: {
orders: true,
},
},
);
}
}
到目前為止,使用系統(tǒng)默認(rèn)數(shù)據(jù)源查詢到了userId=1的用戶信息,和該用戶的所有訂單列表
創(chuàng)建多數(shù)據(jù)源
接下來,創(chuàng)建兩個數(shù)據(jù)源:user-pg和order-mysql
1. 添加數(shù)據(jù)源的類型定義
-
在 VSCode 中,通過右鍵菜單
Vona Init/Types在模塊中創(chuàng)建類型文件 -
然后在類型文件中添加類型定義
{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提供的接口類型。在這里通過接口合并的機(jī)制來添加新的數(shù)據(jù)源類型
2. 數(shù)據(jù)源配置
在項目的App config文件中定義數(shù)據(jù)源的配置信息。由于前面已經(jīng)添加了數(shù)據(jù)源類型,在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: 使用數(shù)據(jù)庫方言:pgorder-mysql: 使用數(shù)據(jù)庫方言:mysql2
使用數(shù)據(jù)源:動態(tài)方式
可以在代碼中動態(tài)使用數(shù)據(jù)源:
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: 傳入要使用的數(shù)據(jù)源,返回新的 Model 實例
到目前為止,使用數(shù)據(jù)源user-pg查詢用戶信息,使用系統(tǒng)默認(rèn)數(shù)據(jù)源查詢訂單列表
使用數(shù)據(jù)源:Relation動態(tài)選項
可以在 relation 選項中動態(tài)指定數(shù)據(jù)源:
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: 指定 relationorders要使用的數(shù)據(jù)源
到目前為止,使用數(shù)據(jù)源user-pg查詢用戶信息,使用數(shù)據(jù)源order-mysql查詢訂單列表
使用數(shù)據(jù)源:Model配置
也可以直接在 Model 中配置數(shù)據(jù)源,從而簡化查詢代碼
- Model Order
@Model({
entity: EntityOrder,
+ client: 'order-mysql',
})
class ModelOrder{}
- 在VonaJS框架中,可以非常方便的為
@Model裝飾器指定參數(shù)
- Model User
@Model({
entity: EntityUser,
+ client: 'user-pg',
relations: {
orders: $relation.hasMany(() => ModelOrder, 'userId'),
},
})
class ModelUser {}
- 查詢數(shù)據(jù)
現(xiàn)在,又可以使用常規(guī)的方式查詢用戶的訂單列表
class ServiceOrder {
async selectUserOrders() {
const userId = 1;
const userAndOrders = await this.scope.model.user.get(
{
id: userId,
},
{
include: {
orders: true,
},
},
);
}
}
使用數(shù)據(jù)源: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文件中提供配置,用于覆蓋對應(yīng)Model的options配置
于是,也可以使用常規(guī)的方式查詢用戶的訂單列表
使用數(shù)據(jù)源:Relation靜態(tài)選項
也可以在定義 Relation 時指定靜態(tài)選項:
@Model({
entity: EntityUser,
client: 'user-pg',
relations: {
orders: $relation.hasMany(() => ModelOrder, 'userId', {
+ meta: {
+ client: 'order-mysql',
+ },
}),
},
})
class ModelUser {}
同樣,也可以使用常規(guī)的方式查詢用戶的訂單列表
Vona ORM已開源:github.com/vonajs/vona

在Vona ORM中實現(xiàn)多數(shù)據(jù)庫/多數(shù)據(jù)源非常直觀、簡便。下面以 Model User/Order 為例,通過查詢用戶的訂單列表,來演示多數(shù)據(jù)庫/多數(shù)據(jù)源的使用方法
浙公網(wǎng)安備 33010602011771號