https://github.com/noear/jtsql
noear::javascript + sql
https://github.com/noear/jtsql
Last synced: 10 months ago
JSON representation
noear::javascript + sql
- Host: GitHub
- URL: https://github.com/noear/jtsql
- Owner: noear
- License: apache-2.0
- Created: 2017-12-20T07:14:07.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-01-02T13:21:09.000Z (over 8 years ago)
- Last Synced: 2025-03-11T11:38:42.281Z (about 1 year ago)
- Language: Java
- Homepage:
- Size: 4.91 MB
- Stars: 33
- Watchers: 4
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# JtSQL
JtSQL = javascript + sql + 模板理念,组合而成的一种创意脚本
定位为数据库的批处理或计划任务(尤其在分布式数据库情境下...)
源码很简单,很有创意哦。哈哈...
JtSQL 特点:
*.结合了JS、SQL、模板理念;
*.保持了JS和SQL的语法高亮(利于DBA审核);
*.方便统一管理、部署、运行
*.像存储过程一样,提供当前上下文及变量支持;
*.像SQL客户端工具一样,即时编写即时运行;
*.像定制统计程序一样,提供过程和逻辑控制能力;
*.服务端运行(别误会成客户端运行啊...)
JtSQL 编码说明:
使用$<db::...>,在Js里嵌入SQL脚本
使用{{...}},在SQL里嵌入Js脚本(注:若它处出现{{ 或 }} 当中加个空隔)
函数log(str),用于记录日志
函数set(key,val),用于设置配置信息
函数get(key),用于获取配置信息
函数http({url,form,header}),用于请求http
函数require(url),用于引入一个JS脚本
函数guid(),用于生成一个GUID
函数md5(str),用于生成MD5加密值
函数sha1(str),用于生成sha1加密值
JtSQL 运行说明:
1.终端运行模式(可用于调试代码或即时运行):
1.1.运行:java -jar jtsql.jar
1.2.输入:脚本代码//可把写好的脚本粘贴进去...
1.3.输入:;;; 并回车
2.批处理运行模式:
运行:java -jar jtsql.jar /data/a/a.jt.sql
3.引入自己的项目:
把源码:JtSqlEngine 放到自己的项目里,随便弄:)
# 缘起?...
分布式数据库:
1.不能写存储过程;
2.不能写事件(即定时任务);
3.不能写函数;
SQL的客户端工具:
1.只能以单句SQL作为执行单元;
2.无变量,无上下文;
开发统计程序:
1.需要编译和特定部署;
2.SQL一般由字符串拼接(无法做语法高亮)
3.DBA难以审核
# 脚本示例(更多见demo目录)
```js
/*1.调用WEBAPI发消一条消息*/
var date1 = $;
http({ url:"http://x.x.x/msg/send/", form:{key:guid(),topic:"sponge.stat.notice",message:date1} });
```
```js
/*2.引入一个JS库;完成数据抓取;*/
require("http://x.x.x/jtsql/cheerio.js");
var html = http({url:"http://m.x.cn/"});
var $ = cheerio.load(html);
log("html::"+ $('#download img').attr('src'));
```
```js
/*3.调用WEBAPI获取IP城市(upd_ip_city.jtsql.js)*/
set("sponge.sponge_track",{db:"sponge_track",user:"xxxx",password:"xxxxxx",url:"jdbc:mysql://x.x.x.x:3306/sponge_track?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true"});
function doItem(item){
var txt = http({ url:"http://iploc.market.alicloudapi.com/v3/ip?ip={{item.ip_val}}",header:{"Authorization":"APPCODE x...x"} });
var ipx = JSON.parse(txt);
if(typeof(ipx.adcode) == 'string'){
$;
}else{
$;
};
};
var list = $;
if(list && list.length){
for(var i in list){
var item = list[i];
doItem(item);
};
};
```
```js
/*4.分类分组统计数据(stat_by_track.jtsql.js)*/
set("sponge.sponge_track",{db:"sponge_track",user:"xxxx",password:"xxxxxx",url:"jdbc:mysql://x.x.x.x:3306/sponge_track?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true"});
var date1 = $;
var date0 = $;
var hours = (new Date()).getHours();
$={{ (hours>7? date0 : date1) }}>;
function stat_track(i) {
/*url*/
var url_ids = $={{i}}>;
if(url_ids){
for(var j in url_ids){
$={{ (hours>7? date0 : date1) }} AND url_id ={{url_ids[j]}}
GROUP BY url_id,log_date,v{{i}};>;
};
};
/*tag*/
var tag_ids = $={{i}};>;
if(tag_ids){
for(var j in tag_ids){
$={{ (hours>7? date0 : date1) }} AND tag_id = {{tag_ids[j]}}
GROUP BY tag_id,log_date,v{{i}}>;
};
};
};
stat_track(1);
stat_track(2);
stat_track(3);
stat_track(4);
stat_track(5);
```