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