Python--使用sqlparse获取SQL指纹


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



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM