{"id":18854871,"url":"https://github.com/noear/jtsql","last_synced_at":"2025-08-20T05:08:34.272Z","repository":{"id":145378736,"uuid":"114855593","full_name":"noear/JtSQL","owner":"noear","description":"noear::javascript + sql","archived":false,"fork":false,"pushed_at":"2018-01-02T13:21:09.000Z","size":5146,"stargazers_count":33,"open_issues_count":1,"forks_count":5,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-11T11:38:42.281Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noear.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-20T07:14:07.000Z","updated_at":"2024-05-11T08:26:09.000Z","dependencies_parsed_at":"2023-06-03T16:30:19.493Z","dependency_job_id":null,"html_url":"https://github.com/noear/JtSQL","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2FJtSQL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2FJtSQL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2FJtSQL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2FJtSQL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noear","download_url":"https://codeload.github.com/noear/JtSQL/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248868825,"owners_count":21174754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T03:52:00.913Z","updated_at":"2025-04-14T10:50:18.776Z","avatar_url":"https://github.com/noear.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JtSQL\nJtSQL = javascript + sql + 模板理念，组合而成的一种创意脚本\u003cbr /\u003e\n定位为数据库的批处理或计划任务（尤其在分布式数据库情境下...）\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n源码很简单，很有创意哦。哈哈...\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\nJtSQL 特点：\u003cbr/\u003e\n*.结合了JS、SQL、模板理念；\u003cbr/\u003e\n*.保持了JS和SQL的语法高亮（利于DBA审核）；\u003cbr/\u003e\n*.方便统一管理、部署、运行\u003cbr/\u003e\n*.像存储过程一样，提供当前上下文及变量支持；\u003cbr/\u003e\n*.像SQL客户端工具一样，即时编写即时运行；\u003cbr/\u003e\n*.像定制统计程序一样，提供过程和逻辑控制能力；\u003cbr/\u003e\n*.服务端运行（别误会成客户端运行啊...）\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\nJtSQL 编码说明：\u003cbr /\u003e\n使用$\u0026lt;db::...\u0026gt;，在Js里嵌入SQL脚本\u003cbr /\u003e\n使用{{...}}，在SQL里嵌入Js脚本（注：若它处出现{{ 或 }} 当中加个空隔）\u003cbr /\u003e\n\u003cbr /\u003e\n函数log(str)，用于记录日志\u003cbr /\u003e\n函数set(key,val)，用于设置配置信息\u003cbr /\u003e\n函数get(key)，用于获取配置信息\u003cbr /\u003e\n函数http({url,form,header})，用于请求http\u003cbr /\u003e\n函数require(url)，用于引入一个JS脚本\u003cbr /\u003e\n函数guid()，用于生成一个GUID\u003cbr /\u003e\n函数md5(str)，用于生成MD5加密值\u003cbr /\u003e\n函数sha1(str)，用于生成sha1加密值\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\nJtSQL 运行说明：\u003cbr /\u003e\n1.终端运行模式（可用于调试代码或即时运行）：\u003cbr /\u003e\n1.1.运行：java -jar jtsql.jar\u003cbr /\u003e\n1.2.输入：脚本代码//可把写好的脚本粘贴进去...\u003cbr /\u003e\n1.3.输入：;;; 并回车\u003cbr /\u003e\n\n2.批处理运行模式：\u003cbr /\u003e\n运行：java -jar jtsql.jar /data/a/a.jt.sql\u003cbr /\u003e\n\u003cbr /\u003e\n3.引入自己的项目：\u003cbr /\u003e\n把源码：JtSqlEngine 放到自己的项目里，随便弄：）\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\n# 缘起?...\u003cbr/\u003e\n分布式数据库：\u003cbr/\u003e\n1.不能写存储过程；\u003cbr/\u003e\n2.不能写事件（即定时任务）；\u003cbr/\u003e\n3.不能写函数；\u003cbr/\u003e\n\u003cbr/\u003e\nSQL的客户端工具：\u003cbr/\u003e\n1.只能以单句SQL作为执行单元；\u003cbr/\u003e\n2.无变量，无上下文；\u003cbr/\u003e\n\u003cbr/\u003e\n开发统计程序：\u003cbr/\u003e\n1.需要编译和特定部署；\u003cbr/\u003e\n2.SQL一般由字符串拼接（无法做语法高亮）\u003cbr/\u003e\n3.DBA难以审核\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n# 脚本示例（更多见demo目录）\n```js\n/*1.调用WEBAPI发消一条消息*/\nvar date1  = $\u003cSELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y%m%d');\u003e;\n\nhttp({ url:\"http://x.x.x/msg/send/\", form:{key:guid(),topic:\"sponge.stat.notice\",message:date1} });\n```\n\n```js\n/*2.引入一个JS库；完成数据抓取；*/\nrequire(\"http://x.x.x/jtsql/cheerio.js\");\n\nvar html = http({url:\"http://m.x.cn/\"});\n\nvar $ = cheerio.load(html);\n\nlog(\"html::\"+ $('#download img').attr('src'));\n\n```\n\n```js\n/*3.调用WEBAPI获取IP城市（upd_ip_city.jtsql.js）*/\n\nset(\"sponge.sponge_track\",{db:\"sponge_track\",user:\"xxxx\",password:\"xxxxxx\",url:\"jdbc:mysql://x.x.x.x:3306/sponge_track?useUnicode=true\u0026characterEncoding=utf8\u0026autoReconnect=true\u0026rewriteBatchedStatements=true\"});\n\nfunction doItem(item){\n\tvar txt  = http({ url:\"http://iploc.market.alicloudapi.com/v3/ip?ip={{item.ip_val}}\",header:{\"Authorization\":\"APPCODE x...x\"} });\n\tvar ipx = JSON.parse(txt);\n\t\n\tif(typeof(ipx.adcode) == 'string'){\n\t\t$\u003csponge.sponge_track::UPDATE user_ip SET city_code = {{ipx.adcode}},is_checked=1 WHERE ip_id = {{item.ip_id}};\u003e;\n\t}else{\n\t\t$\u003csponge.sponge_track::UPDATE user_ip SET is_checked = 1 WHERE ip_id = {{item.ip_id}};\u003e;\n\t};\n};\n\n\nvar list = $\u003csponge.sponge_track::SELECT * FROM user_ip WHERE city_code=0 and is_checked=0 LIMIT 1000;\u003e;\n\nif(list \u0026\u0026 list.length){\n\tfor(var i in list){\n\t\tvar item = list[i];\n\t\tdoItem(item);\n\t};\n};\n\n```\n\n```js\n/*4.分类分组统计数据（stat_by_track.jtsql.js）*/\n\nset(\"sponge.sponge_track\",{db:\"sponge_track\",user:\"xxxx\",password:\"xxxxxx\",url:\"jdbc:mysql://x.x.x.x:3306/sponge_track?useUnicode=true\u0026characterEncoding=utf8\u0026autoReconnect=true\u0026rewriteBatchedStatements=true\"});\n\nvar date1  = $\u003csponge.sponge_track::SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y%m%d')\u003e;\nvar date0  = $\u003csponge.sponge_track::SELECT DATE_FORMAT(NOW(),'%Y%m%d');\u003e;\n\nvar hours = (new Date()).getHours();\n\n\n$\u003csponge.sponge_track::DELETE FROM stat_track_date_hour_pv_uv_ip WHERE log_date\u003e={{ (hours\u003e7? date0 : date1) }}\u003e;\n\nfunction stat_track(i) {\n\t/*url*/\n\tvar url_ids = $\u003csponge.sponge_track::SELECT url_id FROM short_url WHERE track_params_num\u003e={{i}}\u003e;\n\t\n\tif(url_ids){\n\t\tfor(var j in url_ids){\n\t\t\t$\u003csponge.sponge_track::INSERT INTO stat_track_date_hour_pv_uv_ip(url_id,tag_id,log_date,log_hour,vi,vd,uv,pv,ip)\n\t\t\tSELECT url_id,tag_id,log_date,-1,{{i}},v{{i}},COUNT(DISTINCT user_key) uv,COUNT(*) pv,COUNT(DISTINCT log_ip_id) ip\n\t\t\tFROM short_redirect_log_30d \n\t\t\tWHERE log_date\u003e={{ (hours\u003e7? date0 : date1) }} AND url_id ={{url_ids[j]}}\n\t\t\tGROUP BY url_id,log_date,v{{i}};\u003e;\n\t\t};\n\t};\n\n\t/*tag*/\n\tvar tag_ids = $\u003csponge.sponge_track::SELECT tag_id FROM track_tag WHERE t_track_params_num\u003e={{i}};\u003e;\n\tif(tag_ids){\n\t\tfor(var j in tag_ids){\n\t\t\t$\u003csponge.sponge_track::INSERT INTO stat_track_date_hour_pv_uv_ip(url_id,tag_id,log_date,log_hour,vi,vd,uv,pv,ip)\n\t\t\tSELECT -1,tag_id,log_date,-1,{{i}},v{{i}},COUNT(DISTINCT user_key) uv,COUNT(*) pv,COUNT(DISTINCT log_ip_id) ip\n\t\t\tFROM short_redirect_log_30d \n\t\t\tWHERE log_date\u003e={{ (hours\u003e7? date0 : date1) }} AND tag_id = {{tag_ids[j]}}\n\t\t\tGROUP BY tag_id,log_date,v{{i}}\u003e;\n\t\t};\n\t};\n};\n\nstat_track(1);\nstat_track(2);\nstat_track(3);\nstat_track(4);\nstat_track(5);\n\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fjtsql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoear%2Fjtsql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fjtsql/lists"}