暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何获取一条SQL语句中涉及的表名

数据库干货铺 2023-12-20
1021
点击上方蓝字关注我

    在数据库操作和SQL查询的开发过程中,有时候我们为了动态生成查询、进行权限控制、进行查询优化或者其他一些与数据库交互相关、数据库监控等的需求,需要从SQL语句中提取表名。本文分别使用正则表达式和使用SQL解析库的方式来获取。当然实际使用中需要进行优化,本次只是做初步的获取操作。

1.  使用正则表达式
    正则表达式是一种强大的文本匹配工具,通过定义模式,可以从文本中提取需要的信息。在SQL语句中,我们可以使用正则表达式匹配关键字(如FROM、JOIN、UPDATE等)后面的表名,但是通常会因为SQL的复杂度的问题导致提取不够准确。

    import re


    def get_table1(sql_statement):
    table_names = re.findall(r'FROM\s+(\w+)|JOIN\s+(\w+)|UPDATE\s+(\w+)|INTO\s+(\w+)|TABLE\s+(\w+)', sql_statement, re.IGNORECASE)
    for tbs in table_names:
    for tb in tbs:
    print(tb)
    复制

    例如,采用如下方式获取结果:

      if __name__ == '__main__':
      sql = "select * from tb1 where c1='a';"
      get_table1(sql)
      sql = "select * from tb1 a , tb2 b where a.id=b.id and c1='a';"
      get_table1(sql)
      sql ="UPDATE tb3 SET b = 1 WHERE c1='47d8af9d8cd1459a927327b9d548a37b' "
      get_table1(sql)


      复制

      得到的结果如下:

      其中关联查询的SQL结果有误。

        select * from tb1 a , tb2 b  where  a.id=b.id  and   c1='a';
        复制


        2.  使用SQL解析库

        SQL解析库能够更全面地理解SQL语句的结构,提供了更为准确的分析。sqlparse是一个常用的SQL解析库,它可以解析SQL语句并将其转换成语法树。

          import sqlparse


          def get_table2(sql_statement):
          parsed = sqlparse.parse(sql_statement)
          for stmt in parsed:
          for token in stmt.tokens:
          if isinstance(token, sqlparse.sql.IdentifierList):
          for identifier in token.get_identifiers():
          print(identifier.get_real_name())
          elif isinstance(token, sqlparse.sql.Identifier):
          print(token.get_real_name())
          复制

          在使用上述SQL测试一下:

            if __name__ == '__main__':
            sql = "select * from tb1 where c1='a';"
            get_table2(sql)
            sql = "select * from tb1 a , tb2 b where a.id=b.id and c1='a';"
            get_table2(sql)
            sql ="UPDATE tb3 SET b = 1 WHERE c1='47d8af9d8cd1459a927327b9d548a37b' "
            get_table2(sql)
            复制

            测试结果如下:

            关联查询可以获取到准确的表名了。

            注: 以上只是简单演示SQL解析库的方式,对于DDL等也需要再优化一下,否则可能获取到错误信息。

            3.  小结

            从SQL语句中提取表名可以在数据库操作和应用程序开发中发挥重要作用,从而使系统更加灵活、安全、高效。选择合适的提取表名的方法取决于具体的需求和应用场景。例如可以在如下场景中使用:

            • 动态查询生成: 通过提取SQL语句中的表名,可以动态生成适应不同条件的查询语句,提高代码的灵活性

            • 权限控制:根据SQL语句中涉及的表名,可以实现更细粒度的权限控制,确保用户只能访问其有权限的表

            • 查询优化: 了解SQL语句中的表结构有助于进行查询优化,根据表的大小、索引情况等因素进行优化

            • 日志记录:记录每个查询涉及的表名,可以用于性能分析和日志记录,帮助理解应用程序的行为

            • 数据迁移和同步:在数据迁移或同步过程中,了解SQL语句涉及的表结构有助于更好地管理数据变更,确保数据一致性

            • 数据库监控: 可以配合监控数据库中对应表的使用情况监控等


            往期精彩回顾

            1.  MySQL高可用之MHA集群部署

            2.  mysql8.0新增用户及加密规则修改的那些事

            3.  比hive快10倍的大数据查询利器-- presto

            4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

            5.  PostgreSQL主从复制--物理复制

            6.  MySQL传统点位复制在线转为GTID模式复制

            7.  MySQL敏感数据加密及解密

            8.  MySQL数据备份及还原(一)

            9.  MySQL数据备份及还原(二)

            扫码关注     





            文章转载自数据库干货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论