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 里。

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

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"
      }
    ]
  }
}

读写分离

yao 支持读取分离。如果同时存在主库与从库,主库用于写操作,从库用于只读操作。

通过环境变量设置:

  • YAO_DB_PRIMARY,主库,可读写,数据插入,更新操作
  • YAO_DB_SECONDARY,从库,只读,数据查询操作

参考上面的章节进行 connector 配置。

读写分离配置主要用于 query 查询对象,包含 flow 中的 query 对象与 jsapi 中的 query 对象:

  • 在 flows 的 query 查询中,在 flows 定义中可以使用 engine 指定不同的数据库连接,而一般是使用 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 感觉意义不大。

mod.json

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