Skip to content

数据源配置

App Config配置

可以在 App Config 中进行数据源配置:

src/backend/config/config/config.ts

typescript
// orm
config.database = {
  base: {},
  defaultClient: 'pg',
  clients: {},
};
名称说明
base基础配置,为所有数据源提供通用的基础配置
defaultClient默认数据源,默认为pg
clients配置多个数据源

内置数据源

为了开箱即用,系统内置了两个数据源:pgmysql,配置如下:

src/backend/config/config/config.ts

typescript
// database
config.database = {
  clients: {
    pg: {
      client: 'pg',
      connection: {
        host: env.DATABASE_CLIENT_PG_HOST,
        port: Number.parseInt(env.DATABASE_CLIENT_PG_PORT!),
        user: env.DATABASE_CLIENT_PG_USER,
        password: env.DATABASE_CLIENT_PG_PASSWORD,
        database: env.DATABASE_CLIENT_PG_DATABASE,
      },
    },
    mysql: {
      client: 'mysql2',
      connection: {
        host: env.DATABASE_CLIENT_MYSQL_HOST,
        port: Number.parseInt(env.DATABASE_CLIENT_MYSQL_PORT!),
        user: env.DATABASE_CLIENT_MYSQL_USER,
        password: env.DATABASE_CLIENT_MYSQL_PASSWORD,
        database: env.DATABASE_CLIENT_MYSQL_DATABASE,
      },
    },
  },
};
  • Vona ORM 底层使用的是Knex,因此,数据源的配置直接继承自Knex.Config

  • clients.pg.client:使用 Postgresql 方言pg

  • clients.mysql.client:使用 Mysql 方言mysql2

env配置

为了方便配置,内置数据源从 env 环境变量获取配置参数。因此,对于内置数据源我们可以直接通过 env 来提供配置信息

env/.env

typescript
# database

DATABASE_DEFAULT_CLIENT = 'pg' # pg/mysql

DATABASE_CLIENT_PG_HOST = 127.0.0.1
DATABASE_CLIENT_PG_PORT = 5432
DATABASE_CLIENT_PG_USER = postgres
DATABASE_CLIENT_PG_PASSWORD = 
DATABASE_CLIENT_PG_DATABASE = postgres

DATABASE_CLIENT_MYSQL_HOST = 127.0.0.1
DATABASE_CLIENT_MYSQL_PORT = 3306
DATABASE_CLIENT_MYSQL_USER = root
DATABASE_CLIENT_MYSQL_PASSWORD = 
DATABASE_CLIENT_MYSQL_DATABASE = mysql

添加新数据源

如果我们要添加一个新的数据源,名称为pgOrder,使用数据库方言pg,那么,可以如下操作:

1. 添加类型定义

为新数据源添加类型定义

src/backend/config/config/config.ts

typescript
declare module 'vona-module-a-orm' {
  export interface IDatabaseClientRecord {
    pgOrder: never;
  }
}

2. 增加数据源配置

src/backend/config/config/config.ts

typescript
// database
config.database = {
  clients: {
    pgOrder: {
      client: 'pg',
      connection: {
        host: '127.0.0.1',
        port: 5432,
        user: 'postgres',
        password: '',
        database: 'xxxx',
      },
    },
  },
};

如何使用数据源

1. 获取指定数据源

typescript
const pg = app.bean.database.getDb('pg');
const mysql = app.bean.database.getDb('mysql');
const pgOrder = app.bean.database.getDb('pgOrder');

2. 获取默认数据源

默认数据源由配置项defaultClient决定

typescript
const dbDefault = app.bean.database.getDb('default');

3. 获取数据源对应的 knex 实例

系统为不同的数据源创建了不同的 knex 实例,使用 knex 实例操作数据库

typescript
const pg = app.bean.database.getDb('pg');
const items = pg.connection.select('*').from('tableName');

const dbDefault = app.bean.database.getDb('default');
const items = dbDefault.connection.select('*').from('tableName');

4. 获取当前数据源

在实际的代码上下文中,我们可能使用任何一个数据源,那么可以通过以下代码获取上下文中的当前数据源:

typescript
const current = app.bean.database.current;
const items = current.connection.select('*').from('tableName');

默认数据源的高级定制

config.database.defaultClient还可以传入自定义函数。可以通过自定义函数根据请求的上下文自行决定使用哪个数据源:

src/backend/config/config/config.ts

typescript
// database
config.database = {
  defaultClient: (ctx?: VonaContext) => {
    if (ctx?.headers.xxx === 'yyy') return 'pg';
    return 'mysql';
  },
};

基于 MIT 许可发布