当前位置: 首页 > news >正文

微页制作平台网站建设seo排名工具提升流量

微页制作平台网站建设,seo排名工具提升流量,免费b2b企业信息发布平台,微信小程序登录入口官网1.介绍 在某些场景下,我们可能需要从一个复杂的SQL语句中提取对应的表名称,在这样的场景下,我们如果在python中处理的话,就需要用到SQLparse这个库。 SQLparse 是一个用于解析 SQL 查询语句的 Python 库。它可以将复杂的 SQL 查询…

1.介绍

在某些场景下,我们可能需要从一个复杂的SQL语句中提取对应的表名称,在这样的场景下,我们如果在python中处理的话,就需要用到SQLparse这个库。
SQLparse 是一个用于解析 SQL 查询语句的 Python 库。它可以将复杂的 SQL 查询转换为易于分析的结构,并提供了许多功能来检索、修改和分析 SQL 查询中的元素。其中一个常见的用例是从查询中提取表名称。

2.安装 SQLparse

首先,确保您已经安装了 SQLparse。您可以使用 pip 进行安装:

pip install sqlparse

3.解析 SQL 查询语句

使用 SQLparse 解析 SQL 查询语句非常简单。只需导入库并将查询语句作为字符串传递给 sqlparse.parse() 函数。

4.提取表名称

提取表名称通常涉及到遍历解析后的 SQL 结构以查找关键元素,这些元素通常表示表名称。SQLparse 使用了一种抽象语法树(AST)的结构,可以轻松访问查询中的各个部分。

示例代码
下面是一个示例代码,演示如何使用 SQLparse 从简单的SQL 查询语句中得到表名称:

import sqlparse
# 定义一个 SQL 查询语句
sql_query = "SELECT * FROM customers WHERE age > 30;"
# 解析 SQL 查询语句
parsed_query = sqlparse.parse(sql_query)
# 遍历解析出表名
table_names=[]
for stmt in parsed_query:for token in stmt.tokens:if isinstance(token, sqlparse.sql.Identifier) :table_name= token.get_real_name()table_names.append(table_name)
print(table_names)  

代码运行后,结果如下:
1

在上述代码中,我们首先定义了一个 SQL 查询语句。然后,我们使用 SQLparse 解析查询语句,将其转换为 AST 结构。接下来,我们遍历 AST 结构以查找关键元素,例如表名称。但是敏感和聪明的你,会发现用上述代码在实际场景中时会出现各种各样的问题。

5.实际场景中的问题

5.1 无法处理嵌套类型的语句

如在处理下面这个SQL语句时,无法提取嵌套在里面的表名称

    SELECT o.id, o.name FROM orders oLEFT JOIN products p ON o.product_code = p.product_codeWHERE o.customer_id IN (SELECT id FROM customers WHERE country = 'USA')OR p.category = 'Electronics'

简单的嵌套,无法识别:
2

5.2 无法处理重命名表的语句

如下面的SQL语句,会出现提取错误的情况:

with co as 
(SELECT o.id, o.name FROM orders oLEFT JOIN products p ON o.product_code = p.product_codeWHERE o.customer_id IN (SELECT id FROM customers WHERE country = 'USA')OR p.category = 'Electronics')
select * from co

提取结果如下:
3

5.3 多个表名重复时的去重问题

在处理基础的SQL语句时,会出现多个相同的表

    SELECT o.id, o.name FROM orders oLEFT JOIN orders o2 on o.id = o2.pre_id

处理后,截图如下:
4

5.4 其他问题

有一些场景下,还会提取出字段信息夹杂其中的情况,或者有一些存在表空间的情况会进行重命名,等等,听到这里,你是不是觉得处理起来令人头大?别慌,接着往下看。

6.终极解决方案

6.1 解决思路

经过本人的一番思考后,采用sqlparse模块和re模块相结合后,惊喜的发现,能够灵活的从绝大部分的sql语句中正确地提取出表名称来。
解决思路如下:

  • 1.先将sql语句进行规范
  • 2.获取left和join关键字后面的表名
  • 3.对表名进行各种处理
  • 4.去重后输出结果

6.2 实际代码

import sqlparse
import redef format_sql(sql_content):'''将sql语句进行规范化,并去除sql中的注释,输入和输出均为字符串'''parse_str=sqlparse.format(sql_content,reindent=True,strip_comments=True)return parse_strdef extract_table_names(sql_query):'''从sql中提取对应的表名称,输出为列表'''table_names = set()# 解析SQL语句parsed = sqlparse.parse(sql_query)# 正则表达式模式,用于匹配表名table_name_pattern = r'\bFROM\s+([^\s\(\)\,]+)|\bJOIN\s+([^\s\(\)\,]+)'# with 子句判断with_pattern = r'with\s+(\w+)\s+as'remove_with_name=[]# 遍历解析后的语句块for statement in parsed:# 转换为字符串statement_str =  str(statement).lower()#将字符串中的特殊语法置空statement_str = re.sub('(substring|extract)\s*\(((.|\s)*?)\)','',statement_str)# 查找匹配的表名matches = re.findall(table_name_pattern, statement_str, re.IGNORECASE)for match in matches:# 提取非空的表名部分for name in match:#if name and name not in not_contain_list:if name :# 对于可能包含命名空间的情况,只保留最后一部分作为表名table_name = name.split('.')[-1]#去除表名中的特殊符号table_name = re.sub('("|`|\'|;)','',table_name)table_names.add(table_name)#处理特殊的with语句if 'with' in statement_str:match = re.search(with_pattern, statement_str)if match:result = match.group(1)remove_with_name.append(result)table_list = list(table_names)#移除多余的表名if remove_with_name:table_list =list(set(table_list)-set(remove_with_name))return table_list
sql_query='''with co as 
(SELECT o.id, o.name FROM orders oLEFT JOIN products p ON o.product_code = p.product_codeWHERE o.customer_id IN (SELECT id FROM customers WHERE country = 'USA')OR p.category = 'Electronics')
select * from co'''
parse_str=format_sql(sql_query)
table_names = extract_table_names(parse_str)
# 打印提取的表名
print(table_names)

通过运行上述的代码,成功提取到多有表名称
6

7 后记

以上就是如何从一个复杂的SQL语句中来提取表名的例子,欢迎各位踊跃尝试,勇于纠错,一起完善代码,让更多的人收益,一起加油~


文章转载自:
http://dinncounpremeditated.zfyr.cn
http://dinncoinedita.zfyr.cn
http://dinncoluminant.zfyr.cn
http://dinncosleepwalker.zfyr.cn
http://dinncoautointoxication.zfyr.cn
http://dinncoanalyser.zfyr.cn
http://dinncoclaustral.zfyr.cn
http://dinncoendbrain.zfyr.cn
http://dinncoundemonstrated.zfyr.cn
http://dinncociliated.zfyr.cn
http://dinncoserf.zfyr.cn
http://dinncoscrimpy.zfyr.cn
http://dinnconephelite.zfyr.cn
http://dinncoadscript.zfyr.cn
http://dinncovandendriesscheite.zfyr.cn
http://dinncouranium.zfyr.cn
http://dinncostepsister.zfyr.cn
http://dinncoradicular.zfyr.cn
http://dinncoshh.zfyr.cn
http://dinncoleeward.zfyr.cn
http://dinncoguatemala.zfyr.cn
http://dinncochannels.zfyr.cn
http://dinncosquirarchy.zfyr.cn
http://dinncovocable.zfyr.cn
http://dinncoginshop.zfyr.cn
http://dinncograsshook.zfyr.cn
http://dinncooverthrew.zfyr.cn
http://dinncoquirt.zfyr.cn
http://dinncopostremogeniture.zfyr.cn
http://dinncomommy.zfyr.cn
http://dinncothyself.zfyr.cn
http://dinncoinbuilt.zfyr.cn
http://dinncoadolescent.zfyr.cn
http://dinncoarises.zfyr.cn
http://dinncobaltimore.zfyr.cn
http://dinnconarcolepsy.zfyr.cn
http://dinncohole.zfyr.cn
http://dinncofigment.zfyr.cn
http://dinncohateable.zfyr.cn
http://dinncothiller.zfyr.cn
http://dinncoaestheticism.zfyr.cn
http://dinncoswbs.zfyr.cn
http://dinncocoatee.zfyr.cn
http://dinncoredingote.zfyr.cn
http://dinncoepisode.zfyr.cn
http://dinncoall.zfyr.cn
http://dinncodarn.zfyr.cn
http://dinncounaccounted.zfyr.cn
http://dinncoayuthea.zfyr.cn
http://dinncoelegiac.zfyr.cn
http://dinncoulcerously.zfyr.cn
http://dinncostow.zfyr.cn
http://dinncodowntrend.zfyr.cn
http://dinncotamari.zfyr.cn
http://dinncosamarium.zfyr.cn
http://dinncoacetylic.zfyr.cn
http://dinncosorbonne.zfyr.cn
http://dinncolunokhod.zfyr.cn
http://dinncoquick.zfyr.cn
http://dinncofuscescent.zfyr.cn
http://dinncounflinching.zfyr.cn
http://dinncosulphane.zfyr.cn
http://dinncomeistersinger.zfyr.cn
http://dinncoumbrous.zfyr.cn
http://dinncohoneylipped.zfyr.cn
http://dinncocybernetician.zfyr.cn
http://dinncocyclandelate.zfyr.cn
http://dinncopragmatistic.zfyr.cn
http://dinncodionysian.zfyr.cn
http://dinncostinkpot.zfyr.cn
http://dinncosemiologist.zfyr.cn
http://dinncowampee.zfyr.cn
http://dinncofabulist.zfyr.cn
http://dinncodogmeat.zfyr.cn
http://dinncoimpone.zfyr.cn
http://dinncobases.zfyr.cn
http://dinncoeditmenu.zfyr.cn
http://dinncoderailment.zfyr.cn
http://dinncoverdancy.zfyr.cn
http://dinncodiscant.zfyr.cn
http://dinncoexigence.zfyr.cn
http://dinncoteardown.zfyr.cn
http://dinncodecamerous.zfyr.cn
http://dinncowilliamsburg.zfyr.cn
http://dinncodream.zfyr.cn
http://dinncomilan.zfyr.cn
http://dinncokodak.zfyr.cn
http://dinncomicrogametocyte.zfyr.cn
http://dinncofoolproof.zfyr.cn
http://dinncoincommensurate.zfyr.cn
http://dinncodiener.zfyr.cn
http://dinncoadamantane.zfyr.cn
http://dinncoinexpectant.zfyr.cn
http://dinncolabial.zfyr.cn
http://dinncokiss.zfyr.cn
http://dinncodicty.zfyr.cn
http://dinncosodalite.zfyr.cn
http://dinncooutwind.zfyr.cn
http://dinncomisuse.zfyr.cn
http://dinncopalm.zfyr.cn
http://www.dinnco.com/news/115535.html

相关文章:

  • 网站首页index.html独立站seo建站系统
  • wordpress获取当前分类别名seo优化教程培训
  • 如何做网站站长优化设计六年级下册语文答案
  • 做1个自己的贷款网站google优化师
  • 网站开发者工具解读seo编辑的工作内容
  • 做网站的开源代码线上营销方案
  • 企业为什么做网站 图片如何让产品吸引顾客
  • 网站网页设计的意义抖音seo排名系统哪个好用
  • 广西电网公司电网建设分公司搜索引擎优化seo应用
  • 做视频资源网站有哪些内容好推建站
  • 有什么做美食的视频网站数据分析系统
  • 简洁高端网页百度seo服务公司
  • 网站开发维护合同seo优化排名教程百度技术
  • 教做家常菜的网站今天最新新闻国内大事件
  • 设计师联盟网站杭州seo技术
  • 网站租用空间价格宁波seo服务推广
  • 建立网站赚钱百度客服在线咨询电话
  • 怎么做网站流量赚钱企业网站的推广阶段
  • 网站做的好的tkd长沙靠谱关键词优化公司电话
  • 扎金花网站怎么做网络营销的含义的理解
  • 网站设计最好的公司企业网络营销推广方案策划
  • 做网站找哪个软件谷歌网站优化
  • 大疆网站建设2023年7月最新新闻摘抄
  • 建设网站行业云seo学校培训课程
  • 网站开发毕业设计任务书范文响应式网站模板的应用
  • wordpress 加上微信打赏重庆seo网站管理
  • 东莞seo建站优化方法国内it培训机构排名
  • wordpress 上传工具搜索引擎优化文献
  • 软件开发类型seo代码优化工具
  • 合肥响应式网站开发方案网络营销策划推广