`
mabusyao
  • 浏览: 253385 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

javascript解析SQL 语句

    博客分类:
  • UI
阅读更多
最近从上一个项目里面出来,开始了新的项目的工作和学习。在这承上启下之际,花了点时间反思之前学到的东西,又结合新项目知识的学习,做了一个用javascript解析SQL语句的小程序。

在上一个项目的重要工作就是写SQL语句,insert,delete和update语句为主,通过配置数据库中的记录, 来展现用户可定制的页面显示。其中很大一部分工作花费在对SQL语句的检查中。 根据数据库表结构的逻辑关系,我们必须保证输入的数据是有效的,并且是有意义的。为此,我们专门有一个checklist的文档来描述。

当时就很想做一个自动化的工具,每次写完脚本以后,往工具里面一传,马上就能出来个report,说明哪哪不对了,哪个checklist没过了,一目了然。

但是总是太懒惰了,给自己找各种各样的借口,最终也没有去做。

现在的新项目用的是Dojo开发的RIA应用,第一次接触客户端层的开发,相对于传统的J2EE服务器端的开发,根本就是一头雾水。 经历了整整两周时间的混乱,终于多少对javascript的客户端开发有了一定的了解。

于是就想到了为前一个项目做点贡献,利用dojo/javascript开发一个解析SQL语句的web小工具。

技术难点:
1. 利用正则表达式匹配SQL语句。
2. 能够解析出scripts中的注释及COMMITS语句并提取出。

代码:
1. validateSQL函数中定义了匹配SQL语句的正则表达式,并对每一种SQL分别处理,并返回结果。
2. splitSqlArray通过分号来区分语句,同时去掉所有注释。 要注意的是,SQL的value中有可能包含分号, 需要把这种情况考虑到。

	validateSQL: function(content) {
		var insertReg = /INSERT[\s+\n+]+INTO[\s+\n+]+\S+[\s*\n*]*\([\S*\s*\n*]+\)[\s*\n*]+VALUES[\s*\n*]*\([\S*\s*\n*]+\)/;
		var updateReg = /UPDATE[\s+\n+]+\S+[\s+\n+]+SET[\S*\s*\n*]+(WHERE[\S*\s*\n*]+)?/;
		var deleteReg = /DELETE[\s+\n+]+FROM[\s+\n+]+\S+[\s+\n+]+(WHERE[\S*\s*\n*]+)?/;
		var commitReg = /COMMIT;/;

		var scriptArray = Util.splitSqlArray(content);
		var result = new Array();
		for(var i = 0; i <scriptArray.length; i++) {
			if(scriptArray[i].word.trim() == "") continue;

			var script = scriptArray[i].word.trim();
			if((stat = insertReg.exec(script)) != null) {
				sTable = stat[0].substring(stat[0].indexOf("INTO") + 4,  stat[0].indexOf("(")).trim();
				var item = [scriptArray[i].rowid, sTable, "INSERT", "NA", 1, "LOW", script];
			} else if((stat = updateReg.exec(script))!= null) {
				sTable = stat[0].substring(stat[0].indexOf("UPDATE") + 6,  stat[0].indexOf("SET")).trim();
				if(stat[0].indexOf("WHERE") > 0) {
					sCond = stat[0].substring(stat[0].indexOf("WHERE") + 5).trim();
					item = [scriptArray[i].rowid, sTable, "UPDATE", sCond, 100, "MEDIUM", script];
				} else {
					item = [scriptArray[i].rowid, sTable, "UPDATE", "NA", 100, "HIGH", "You don't have a where clause!"];
				}
			} else if((stat = deleteReg.exec(script))!= null) {
				sTable = stat[0].substring(stat[0].indexOf("FROM") + 4,  stat[0].indexOf("WHERE")).trim();
				if(stat[0].indexOf("WHERE") > 0) {
				sCond = stat[0].substring(stat[0].indexOf("WHERE") + 5).trim();
				item = [scriptArray[i].rowid, sTable, "DELETE", sCond, 100, "MEDIUM", script];
				} else {
					item = [scriptArray[i].rowid, sTable, "UPDATE", "NA", 100, "HIGH", "You don't have a where clause!"];
				}
			} else {
				item = null;
			}
			if(item != null) result[result.length] = item;
		}
		
		return result;
	}


	splitSqlArray:function(content) {
		var count = 1;
		var started = false;
		var result = new Array();
		
		for(var i = 0; i < content.length; i++) {
			var cChar = content.charAt(i);
			
			if(cChar == '-') {
				if(content.charAt(i + 1) == '-') {
					while(true) {
						cChar = content[++i];
						if(cChar == '\n') {
							count++;
							break;
						}
					}
					continue;
				}
			}

			if(cChar == '\n'){
				count++;
				continue;
			} 
			
			if(!started) {
				var iRowid = count;
				var sWord = new Array();
				sWord[sWord.length] = cChar;
				started = true;
			} else if(cChar == "'"){
				sWord[sWord.length] = cChar;
				while(true) {
					cChar = content[++i];
					sWord[sWord.length] = cChar;
					
					if(cChar == "'") break;
				}
			} else if(cChar == ";") {
				result[result.length] = {rowid : iRowid, word:(sWord.join(""))};
				started = false;
			} else {
				sWord[sWord.length] = cChar;
			}
		}
		
		return result;
	}


测试用的SQL:
--  #########  INSERTs  for  CLSFDWAPS  on server S  #########  --

--  ###  PROV.APPROVED_FIELDS_MAPPING
INSERT INTO PROV.APPROVED_FIELDS_MAPPING (APP_CODE, GROUP_NO, INPUT_FORM_FIELD, INPUT_FORM_VAL, "TYPE") 
VALUES ('CLSFDWAPS', 01, 'Region', 'Region_AseanIsa', 'INTRANET');

INSERT INTO PROV.APPROVED_FIELDS_MAPPING (APP_CODE, GROUP_NO, INPUT_FORM_FIELD, INPUT_FORM_VAL, "TYPE") 
VALUES ('CLSFDWAPS', 02, 'Region', 'Region_AusNz', 'INTRANET');

INSERT INTO PROV.APPROVED_FIELDS_MAPPING (APP_CODE, GROUP_NO, INPUT_FORM_FIELD, INPUT_FORM_VAL, "TYPE") 
VALUES ('CLSFDWAPS', 03, 'Region', 'Region_Gcg', 'INTRANET');

-- here is what I am testing.
-- again still test.
UPDATE PROV.APPROVED_FIELDS_MAPPING SET APP_CODE='CLSFDWAPS';

commit;


得到的结果:


其实很多内容都还没有考虑,比方说checklist,现在只考虑了一种,就是update/delete没有where语句。

日后慢慢改吧,如果有时间的话。
  • 大小: 19.2 KB
分享到:
评论

相关推荐

    JsonSQL:用SQL语句解析JSON文件

    **JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...

    js-sql-parser:用jison编写SQL(select)解析器。 将SQL解析为抽象语法树(AST),然后字符串化回SQL。 sql语法遵循https:dev.mysql.comdocrefman5.7enselect.html

    js-sql-parser 在js中解析/字符串化sql(选择语法)。 sql语法遵循新闻自v1.3.0 起修复bug tableFactor别名从v1.2.2开始,增加了对“`”引号别名的支持 BUG修复字符串化的关键字having自V1.2.1。 自v1.2.0起,错字...

    delphi解析json转换成sql语句

    "delphi解析json转换成sql语句"这个主题涉及两个主要方面:JSON解析和SQL语句构建。首先,我们需要理解如何在Delphi中解析JSON。Delphi从XE4版本开始,引入了Indy库中的TIdJSON和TJSONObject类,以及后来的System....

    实现sql语句正确验证的控件

    在开发过程中,确保用户输入的SQL语句正确无误是非常关键的,因为错误的SQL语句可能导致数据损坏或者安全风险。本文将探讨如何实现一个用于验证SQL语句正确性的控件,并提供一个简单的实现例子。 首先,我们要理解...

    所有国家的下拉列表sql语句创建

    根据提供的信息,我们可以详细解析如何创建一个包含所有国家信息的SQL表,并且如何填充这个表以供下拉列表使用。 ### 数据库表结构设计 首先,我们从标题和描述中得知,目标是创建一个名为 `country` 的表,用于...

    antlr3学习以及简单的应用--使用sql语句查询集合中的对象

    在这个“ANTLR3学习以及简单的应用--使用sql语句查询集合中的对象”的主题中,我们主要关注如何利用ANTLR3解析SQL语句,以便在非关系型数据库(NoSQL)环境下进行查询操作。由于NoSQL数据库通常不支持标准SQL,因此...

    yasqlp:另一个用于JavascriptSQL解析器

    安装后,可以导入yasqlp模块,并调用其提供的方法来解析SQL语句。然后,可以遍历生成的AST,进行进一步的处理,例如验证SQL安全性、优化查询或者转换成其他格式。 总之,Yasqlp作为一个JavaScript SQL解析器,它...

    OA项目源代码+sql语句

    在“OA项目源代码+sql语句”这个主题中,我们可以深入探讨OA系统的核心技术和关键组件。 1. **系统架构** OA系统通常基于B/S架构(Browser/Server),即浏览器/服务器模式,用户通过网页浏览器访问系统,降低了...

    JavaScript常用语句精选

    ### JavaScript常用语句精选 #### 一、概述 在网页开发中,JavaScript 是一种非常重要的客户端脚本语言,被广泛应用于交互式网站的设计与实现。本文档中的代码片段虽然较为特殊且不易理解,但其中涉及到了一些关键...

    Javascript: SQL <==> Java String 互转

    如果是,我们将其替换为字符串 `'NULL'`,这样在 SQL 解析时会识别为 `NULL` 值。请注意,这里不使用引号包裹 `'NULL'`,因为 `NULL` 在 SQL 中是一个关键字,而不是字符串。 对于非 `NULL` 字符串,JavaScript 与 ...

    sqlParse:解析sql字符串以获取列名和参数

    更高级的方法是使用解析器库,如Jison或ANTLR,它们可以根据自定义的语法规则生成解析器,能更准确地解析SQL语句。 `sqlParse`可能提供了以下功能: 1. **列名提取**:从SELECT语句中识别并返回所有的列名,包括...

    Web程序实现简易版PL/SQL和Execel表配置备份SQL语句

    本项目“Web程序实现简易版PL/SQL和Excel表配置备份SQL语句”旨在构建一个基于Web的平台,以方便地管理和执行PL/SQL代码,并将数据库备份到Excel表格中。 1. **PL/SQL基础** PL/SQL是Oracle数据库系统的一部分,它...

    node-sql-parser:使用访问的tableList将简单SQL语句解析为抽象语法树(AST),并将其转换回SQL

    Nodejs SQL解析器 使用访问的tableList,columnList将简单SQL语句解析为抽象语法树(AST),然后将其转换回SQL。 :star: 特征支持用分号分隔的多个sql语句支持选择,删除,更新和插入类型支持放置,截断和重命名命令...

    Python实现把json格式转换成文本或sql文件

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 的语法简单明了,易于理解: ```json [ { "author": "作者", ...

    SQL自动生成JSON数据.docx

    首先,需要声明变量@TableName、@sql、@CurPageFirstRow、@CurPageLastRow和@OrderByColumn,分别用于存储表名、SQL语句、当前页的第一行、当前页的最后一行和排序列名。 然后,使用SYS.SYSCOLUMNS系统视图来获取表...

    sql-parser:解析 mysql create table 语句,用于通过建表语句生成 model 代码文件

    解析 mysql create table 语句,用于通过建表语句生成 model 代码文件。 yarn install yarn dev 或 npm i npm run dev // 构建支持浏览器环境的代码文件,浏览器端直接引用构建出来的 browser/sql-parser.min.js ...

    把一个json生成一个创建sql

    例如,Python的`json`模块用于解析JSON,而`sqlalchemy`库则可以用来生成SQL语句。 在进行JSON到SQL的转换时,需要注意以下几点: 1. 数据类型匹配:JSON中的数据类型可能需要转换为SQL兼容的类型,如字符串、整数...

    一个快速实现SQL转Restful微服务接口的工具

    1. SQL解析:工具需要能够解析SQL语句,理解查询的结构和意图,以便将其映射到HTTP请求的路由和参数。 2. RESTful设计:遵循REST原则,如使用HTTP动词(GET、POST、PUT、DELETE等)表示操作,通过URL路径传递资源...

    事务处理函数transaction与executeSQL解析.docx

    本文将深入解析事务处理函数 `transaction` 和执行 SQL 语句的函数 `executeSQL`。 1. **事务处理函数 `transaction`** 事务是数据库操作的基本单元,确保一组操作要么全部成功,要么全部失败,避免了数据不一致的...

    数据库导出xml并且javascript解析

    "数据库导出XML并且JavaScript解析"这一主题涉及了数据库操作、XML数据格式以及客户端脚本处理。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换,因为它具有结构化、自解释性和平台无关性。以下...

Global site tag (gtag.js) - Google Analytics