某些场景下,需要临时连接到,未提前定义的或者随时变更的数据库。
在 mysql 中可以创建远程表 (federated engine) 来实现.
本工具提供了类似的实现方案, 无需建虚拟表可直接链接临时数据源.
语法
- SQL
dynamicSourceQuery(select * from xxx) on url='jdbc:sqlite:/usr/local/junit/data/sqlite_3.db'
- 语法
dynamicSourceQuery(要执行的sql) on url=’jdbc:xxx://127.0.0.1’ and user=’xxx’ and password=’xxx’ and driver=’xxx’
- 参数 V:0.3.25
| 参数 | 必填 | 默认值 | 举例 | 说明 |
|---|---|---|---|---|
| source_type | 否 | jdbc | jdbc, sysql, http | 如果为jdbc则直接查询不使用连接池 |
| url | 是 | 1 | jdbc:sqlite:sqlite.db | 数据源jdbc链接 |
| user | 否 | - | root | 数据库账户 |
| password | 否 | - | root | 数据库账户 |
| driver | 否 | 根据url自适应 | com.mysql.jdbc.Driver | 数据库驱动 |
| retry | 否 | 1 | 3 | 查询失败时自动重试的次数 |
- 注意
- 默认不开启 sysql 的语法验证和语法修正, 要执行的 sql 会直接发给数据源执行.
- 与 mysql 的 federated 功能一样, 出于安全考虑 dynamicSourceQuery 功能默认不启用, 需要在程序中手动注册此命令才能启用.
- 默认不启用连接池, 因此请注意目标服务器连接数限制.
- 关于超时
可以使用 jdbc 的超时参数
jdbc:mysql://127.0.0.1/test?connectTimeout=2000&socketTimeout=30000
http 查询样例
-- 将百度IP归属地接口当初虚拟表做查询
dynamicSourceQuery(select 'baidu' s, `$.data.OriginQuery` ip, `$.data.location` addr from list)
on source_type='http' and url='https://opendata.baidu.com/api.php?query=36.110.32.12&co=&resource_id=6006&oe=utf8'
http返回值:
{"status":"0","t":"","set_cache_time":"","data":[{"ExtendedLocation":"","OriginQuery":"36.110.32.12","appinfo":"","disp_type":0,"fetchkey":"36.110.32.12","location":"北京市北京市 电信","origip":"36.110.32.12","origipquery":"36.110.32.12","resourceid":"6006","role_id":0,"shareImage":1,"showLikeShare":1,"showlamp":"1","titlecont":"IP地址查询","tplt":"ip"}]}
sql返回值:
| s | ip | addr |
|---|---|---|
| baidu | 36.110.32.12 | 北京市北京市 电信 |