# -*- 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()