# -*- coding:UTF-8 -*-
import re
import sqlparse
class SQLFingerPrint(object):
@classmethod
def format_tokens(cls,tokens, sql_items):
"""
将数字和字符串替换为?
"""
for token in tokens:
if token.is_group:
cls.format_tokens(token.tokens, sql_items)
else:
if token.ttype.parent.__repr__() == "Token.Literal.String":
sql_items.append("'?'")
elif token.ttype.parent.__repr__() == "Token.Literal.Number":
sql_items.append("?")
else:
sql_items.append(token.value)
return sql_items
@classmethod
def format_sql(cls,sql):
"""
格式化SQL语句并返回指纹SQL
"""
parsed_sqls=sqlparse.parse(sql)
if len(parsed_sqls)==0:
return ""
tokens = sqlparse.parse(sql)[0].tokens
sql_items = cls.format_tokens(tokens=tokens, sql_items=[])
tmp_sql=" ".join(sql_items).replace("\r", " ").replace("\n", " ").replace("\t", " ")
return re.sub(r"\s+"," ",tmp_sql)
def demo():
sql_text = """
select id,name_,age as 'new_age' from dual;
select id,'18;19',age,33454354.453 from actor where
id='dsadsadsadsadsadsadsadsadads'
and id2=12321321321
and dt='2011-10-10';
"""
sqls = sqlparse.split(sql_text)
for sql in sqls:
print("=" * 20)
print(SQLFingerPrint.format_sql(sql=sql))
if __name__ == "__main__":
demo()