不同数据库连接配置
支持的数据库列表
- 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 里。
Yao 引擎在系统初始化时会把连接配置存入到全局连接池中,作为应用程序的默认连接。为了与其它的 connector 作区别,这个默认数据库的配置的名称是default
.
读写分离
数据库的读写分离是通过配置环境变量来实现的。比如像 mysql 数据库,可以配置两个数据库进行主分复制的架构设置,主库用于用户的写入操作。从库用于用户的查询操作,用于减轻数据库压力。
主从数据库的数据库类型YAO_DB_DRIVER
需要是一样的。比如都是 MYSQL.
同时,YAO_DB_PRIMARY
与YAO_DB_SECONDARY
都支持配置多个数据库连接配置,使用|分割。
当在执行写入,删除,更新操作时,需要使用支持可写的主库连接。当在 Query 中进行数据查询时,会优先使用从库连接。如果不存在主库,会使用从库连接。不能两个都没有配置。
如果主库或是从库存在多个数据库连接,会随机选择一个连接。
不同的数据库的环境变量示例:
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"
}
]
}
}
connector 配置文件支持使用环境变量来配置用户密码等敏感的信息。
读写分离
yao 支持多个数据库连接,通过配置 connector
来实现读写分离。
同时 connector
配置也是支持读写分离的配置,参考上面的YAO_DB_PRIMARY
与YAO_DB_SECONDARY
进行connector
配置。
- 在 flows 的 query 查询中,在 flows 定义中可以使用
engine
指定不同的数据库connector
连接,而一般是使用 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
会在执行 migrate
时把数据库创建在别的数据库中。
注意读写分离是针对整个数据库,而不是针对某个表。默认的数据库连接只有一个,这里可以可以配置上面的 js 中 Query 对象的 engine 来指定不同的数据库连接。或是使用 flow 的 engine 指定不同的数据库连接。
mod.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_DRIVER
与YAO_DB_PRIMARY
的配置。 - 需要注意读写分离与
connector
的区别,一个是连接不同的数据库,另外一个是在同一个数据库源中设置读写分离。 - 数据库
migrate
操作默认是只针对主数据库,并不会影响从库,如果需要特别的把一个表结构同步到从为,需要在model
定义中配置connector
。 - 如果两个数据库的表数据库不一样,可以理解为异构数据库,不要使用主从库配置。而是使用
connector
配置,并在flow
中使用engine
指定不同的connector
,或是在 JSAPI 中使用Query
对象的engine
指定不同的connector
。