Skip to content
导航栏

不同数据库连接配置

支持的数据库列表

  • sqlite
  • mysql
  • postgres 隐藏的支持的数据库
  • hdb 个人定制匹配

最常用的是 mysql 与 sqlite,在 xgen 配置界面上也只能找到这两个。

yao 针对于 mysql 与 sqlite 在源代码上会有一些优化。比如使用 mysql 作为数据库,可以在查询中使用 json 查询表达式。

数据库的默认连接配置需要配置环境变量 YAO_DB_DRIVERYAO_DB_PRIMARY.

  • YAO_DB_DRIVER 数据库类型
  • YAO_DB_PRIMARY 数据库 dsn 连接字符串

一般会把这两个环境变量写在文件.env 里。

Yao 引擎在系统初始化时会把连接配置存入到全局连接池中,作为应用程序的默认连接。为了与其它的 connector 作区别,这个默认数据库的配置的名称是default.

读写分离

数据库的读写分离是通过配置环境变量来实现的。比如像 mysql 数据库,可以配置两个数据库进行主分复制的架构设置,主库用于用户的写入操作。从库用于用户的查询操作,用于减轻数据库压力。

主从数据库的数据库类型YAO_DB_DRIVER需要是一样的。比如都是 MYSQL.

同时,YAO_DB_PRIMARYYAO_DB_SECONDARY都支持配置多个数据库连接配置,使用|分割。

当在执行写入,删除,更新操作时,需要使用支持可写的主库连接。当在 Query 中进行数据查询时,会优先使用从库连接。如果不存在主库,会使用从库连接。不能两个都没有配置。

如果主库或是从库存在多个数据库连接,会随机选择一个连接。

不同的数据库的环境变量示例:

sqlite

sh
YAO_DB_DRIVER="sqlite3"
YAO_DB_PRIMARY="db/yao.db"

mysql

sh
YAO_DB_DRIVER=mysql
YAO_DB_PRIMARY="root:123456@tcp(172.18.3.234:33306)/yao_ai?charset=utf8mb4&parseTime=True&loc=Local"

postgres

不再 yao setup 界面里,但是 xun 是支持 pg 的。

sh
YAO_DB_DRIVER=postgres
YAO_DB_PRIMARY="postgres://xun:123456@db-server:5096/xun?sslmode=disable&search_path=xun"

hdb

sap hana database,这个是本人作的适配器,不在官方版本中。

sh
YAO_DB_DRIVER=hdb
YAO_DB_PRIMARY="hdb://HANA_READONLY:Hana@readonly123@172.18.3.30:30015?defaultSchema=HANA_READONLY"

通过 connector 配置

在一个 yao 应用中,除了上面使用环境变量设置默认的连接外,还可以使用 connector 设置其它的数据库连接。

在应用目录 connectors 目录下创建配置。

sqlite3 connector 配置文件connectors/sqlite3.conn.json

json
{
  "LANG": "1.0.0",
  "VERSION": "1.0.0",
  "label": "SQLite TEST",
  "type": "sqlite3",
  "options": {
    "file": "$ENV.SQLITE_DB"
  }
}

mysql connector 配置文件connectors/mysql.conn.json

设置主库,在 connector 的配置中把 host 的 primary 设置为 true,比如options.hosts[0].primary设置 true。

数据库连接可以设置多个,如果存在多个连接,使用时会随机挑选一个。

注意:需要同时配置主库与从库连接。

json
{
  "LANG": "1.0.0",
  "VERSION": "1.0.0",
  "label": "MySQL 8.0 TEST",
  "type": "mysql", //类型,官方只支持支持sqlite3,mysql,扩展支持postgres,hdb
  "version": "8.0.26",
  "options": {
    "db": "test",
    "charset": "utf8mb4",
    "parseTime": true,
    "hosts": [
      {
        "host": "$ENV.MYSQL_TEST_HOST",
        "port": "$ENV.MYSQL_TEST_PORT",
        "user": "$ENV.MYSQL_TEST_USER",
        "pass": "$ENV.MYSQL_TEST_PASS",
        "primary": true //主库
      },
      {
        "host": "$ENV.MYSQL_TEST_HOST",
        "port": "$ENV.MYSQL_TEST_PORT",
        "user": "$ENV.MYSQL_TEST_USER",
        "pass": "$ENV.MYSQL_TEST_PASS"
      }
    ]
  }
}

connector 配置文件支持使用环境变量来配置用户密码等敏感的信息。

读写分离

yao 支持多个数据库连接,通过配置 connector 来实现读写分离。

同时 connector 配置也是支持读写分离的配置,参考上面的YAO_DB_PRIMARYYAO_DB_SECONDARY进行connector配置。

  • 在 flows 的 query 查询中,在 flows 定义中可以使用 engine 指定不同的数据库connector连接,而一般是使用 default 连接,default 连接是指环境变量中配置的数据库。

flows/tests/session.flow.yao

json
{
  "name": "Session",
  "version": "1.0.0",
  "description": "Session TestFlow",
  "nodes": [
    {
      "name": "User",
      "engine": "query-test",
      "query": {
        // "debug": true,
        "select": ["id", "name", "type"],
        "from": "$user",
        "wheres": [{ ":id": "用户ID", "=": "?:$res.ID" }],
        "first": true
      }
    }
  ],
  "output": {
    "User": "{{$res.User}}"
  }
}
  • jsapi,在 jsapi 中可以在初始化 Query 对象时指定不同的 connector,默认为空时将使用 default 连接。
js
var query = new Query('default'); //可以指定不同的数据库connector
var money_count = query.Get({
  wheres: [{ ':deleted_at': '删除', '=': null }],
  select: [':SUM(total_money) as num'],
  from: 'account',
});

query 查询默认是使用的从库的只读连接,如果没有从库配置,就会使用默认的主库连接配置。

migrate 命令使用不同的 connector

yao 可以在 model 定义中配置 connector 连接不同的数据库。针对一个模型设置不同的 connector 会在执行 migrate 时把数据库创建在别的数据库中。

注意读写分离是针对整个数据库,而不是针对某个表。默认的数据库连接只有一个,这里可以可以配置上面的 js 中 Query 对象的 engine 来指定不同的数据库连接。或是使用 flow 的 engine 指定不同的数据库连接。

mod.json

json
{
  "name": "test",
  "connector": "mysql",
  "table": {
    "name": "test"
  },
  "columns": [{
    ...
  }]
}

bug 修复

修复由于只配置了primary host导致无法在js query中使用 Get 方法。

https://github.com/wwsheng009/gou/commit/c21e8a8c9a2ee131d90006d8d8840134856019f4

总结

  • 在 Yao 中,支持多数据库连接配置,使用connector来配置。也支持主从库配置,使用 primary 与 second 来区别。
  • 在 Yao 中,支持同一类型数据库,也即是同一类型的connector读写分离。
  • 主从库配置的两个连接的数据库数据结构上是一致的。那些需要同时写入与读取的表需要在两个数据库中同时存在才可以。
  • 读写分离是按 SQL 的执行方式来区分的。比如读取数据会使用从库,而写入就必须需要在主库中执行。当一个connector配置了从库,读取分离是自动在程序中根据 sql 的操作自动处理。
  • 在 Yao 中,默认的connector是数据库YAO_DB_DRIVERYAO_DB_PRIMARY的配置。
  • 需要注意读写分离与connector的区别,一个是连接不同的数据库,另外一个是在同一个数据库源中设置读写分离。
  • 数据库migrate操作默认是只针对主数据库,并不会影响从库,如果需要特别的把一个表结构同步到从为,需要在model定义中配置connector
  • 如果两个数据库的表数据库不一样,可以理解为异构数据库,不要使用主从库配置。而是使用connector配置,并在flow中使用engine指定不同的connector,或是在 JSAPI 中使用Query对象的engine指定不同的connector