An open API service indexing awesome lists of open source software.

https://github.com/noear/jtsql

noear::javascript + sql
https://github.com/noear/jtsql

Last synced: 10 months ago
JSON representation

noear::javascript + sql

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);

```