不同数据库连接配置
支持的数据库列表
- sqlite
- mysql
- postgres 隐藏的支持的数据库
- hdb 个人定制匹配
最常用的是 mysql 与 sqlite,在 xgen 配置界面上也只能找到这两个。
yao 针对于 mysql 与 sqlite 在源代码上会有一些优化。比如使用 mysql 作为数据库,可以在查询中使用 json 查询表达式。
数据库的默认连接配置需要配置环境变量 YAO_DB_DRIVER
与 YAO_DB_PRIMARY
。
YAO_DB_DRIVER
数据库类型YAO_DB_PRIMARY
数据库 dsn 连接字符串
一般会把这两个环境变量写在文件.env 里。
不同的数据库的环境变量示例:
sqlite
YAO_DB_DRIVER="sqlite3"
YAO_DB_PRIMARY="db/yao.db"
mysql
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 的。
YAO_DB_DRIVER=postgres
YAO_DB_PRIMARY="postgres://xun:123456@db-server:5096/xun?sslmode=disable&search_path=xun"
hdb
sap hana database,这个是本人作的适配器,不在官方版本中。
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
{
"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。
数据库连接可以设置多个,如果存在多个连接,使用时会随机挑选一个。
{
"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
{
"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 连接。
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
{
"name": "test",
"connector": "mysql",
"table": {
"name": "test"
},
"columns": [{
...
}]
}