数据库规划

由于CabloyJS内置三个运行环境,因此,我们需要对不同的运行环境配置不同的MySQL参数。在介绍MySQL参数配置之前,我们还需要先介绍一个数据库规划的概念

为了进一步优化日常的开发体验,提升开发效率,CabloyJS定义了一个数据库规划的概念,具体如下:

1. 测试环境

测试环境不必指定数据库名称,而是由系统自动创建测试数据库。每当执行单元测试时,总是删除旧的测试数据库,然后创建一个新的测试数据库

# 执行单元测试
$ npm run test:backend

比如,项目的名称是cabloy-demo,当执行单元测试时,系统会自动创建一个测试数据库,数据库名称为egg-born-test-cabloy-demo-20210703-110520

  • 这样设计的好处:在项目的开发迭代当中,难免会频繁的修改数据库架构。那么一般的做法是,打开数据库管理工具进行手工修改。在CabloyJS中,只需要在模块的Bean组件version.manager中编写变更逻辑,然后执行一遍单元测试就生效了。换句话说,在CabloyJS开发当中,很少用到数据库管理工具

  • 有人会问一个问题:如果执行单元测试会重新创建一个新的数据库,那么之前的测试数据是不是又需要重新手工输入一遍?

    • 针对这个问题,CabloyJS也提出了相应的解决方案:就是在模块的Bean组件version.manager中直接编写测试数据的初始化逻辑。每当创建新的测试数据库时,这些测试数据都会自动生成

关于模块的Bean组件version.manager,请参见:模块数据版本与变更

2. 开发环境

开发环境也不必指定数据库名称。每当启动后端开发服务时,总是查找可用的测试数据库,如果没有找到(比如,没有执行过单元测试)就自动创建一个新的测试数据库

# 启动后端开发服务
$ npm run dev:backend

3. 生产环境

生产环境需要手工创建数据库,并在config.prod.js中指定数据库名称

# 启动服务
$ npm run start:backend
# 启动服务(后台运行)
$ npm run start:backend-daemon
# 停止服务
$ npm run stop:backend

MySQL连接配置

1. 测试环境

src/backend/config/config.unittest.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: 'mysql', // donnot change the name
      },
    },
  };
名称 说明
__ebdb 这是系统内置的MySQL节点名,不允许变更
database 指定为mysql,在执行单元测试时,会自动删除旧的测试数据库,然后创建一个新的测试数据库

2. 开发环境

src/backend/config/config.local.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: 'mysql', // recommended
      },
    },
  };
名称 说明
database 推荐指定为mysql,在启动后端开发服务时,查找可用的测试数据库,如果没有找到就创建一个新的测试数据库。如果指定为其他具体的数据库名,就直接使用此数据库

3. 生产环境

src/backend/config/config.prod.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: '',
        database: '{{name}}',
      },
    },
  };
名称 说明
database 此数据库需要手工创建

SQL语句输出

在CabloyJS中只需指定一个参数即可实现SQL语句的输出,方面我们排查SQL方面的问题

src/backend/config/config.{env}.js

  // mysql
  config.mysql = {
    clients: {
      // donnot change the name
      __ebdb: {
        ...
        hook: {
          meta: {
            long_query_time: 200,
          },
        },
      },

    },
  };
名称 单位 说明
long_query_time 毫秒 当SQL语句执行时间超过该值,就会输出到控制台。如果设置为0,就相当于输出所有的SQL语句