query = 'Select a, col_2 as b from Table_A;select * from foo'
print(sqlparse.format(query, reindent=True, keyword_case='upper'))
format()函数接受关键字参数:
- keyword_case 关键词upper、lowersql的保留字大小写
- identifier_case 标识符的upper、lower大小写
- strip_comments=Ture删除注释
- reindent=Ture美化sq缩进语句发生改变
4.split
该方法用于分割sql语句:
sqlparse.split(query)
这里补充一下calss类sqlparse.sql.Statement是可以直接通过str转换为字符串的。
结果返回一个分割后的list。至此初始方法就写完了,下面我将详解一下基类,这将决定是我们是否能灵活运用此库。
2.基类-Token
我们来看看Token的初始方法属性:
def __init__(self, ttype, value):
value = str(value)
self.value = value
self.ttype = ttype
self.parent = None
self.is_group = False
self.is_keyword = ttype in T.Keyword
self.is_whitespace = self.ttype in T.Whitespace
self.normalized = value.upper() if self.is_keyword else value
这个Token类也就是语法解析器的重点数据流了:
此类需要生成Tokens使用,这牵扯到另一个方法tokens.py:
此方法也就是将statment类转换为Token流:
parsed = sqlparse.parse(query)
stmt = parsed[0]
stmt.tokens
其中我们需要解析的每个Token的标识码也就是第一个ttype属性,解析之后:
for each_token in sql_tokens:
print(each_token.ttype,each_token.value)
我们拿一个Token来研究就能逐渐解析到其他token。我们建立一个列表将其主要属性ttype和value收集起来:
type(list_ttype[0])
type(list_value[0])
第一个属性为sqlparse.tokens._TokenType第二个value直接就是str了。上tokens看_TokenType:
# Special token types
Text = Token.Text
Whitespace = Text.Whitespace
Newline = Whitespace.Newline
Error = Token.Error
# Text that doesn't belong to this lexer (e.g. HTML in PHP)
Other = Token.Other
# Common token types for source code
Keyword = Token.Keyword
Name = Token.Name
Literal = Token.Literal
String = Literal.String
Number = Literal.Number
Punctuation = Token.Punctuation
Operator = Token.Operator
Comparison = Operator.Comparison
Wildcard = Token.Wildcard
Comment = Token.Comment
Assignment = Token.Assignment
# Generic types for non-source code
Generic = Token.Generic
Command = Generic.Command
# String and some others are not direct children of Token.
# alias them:
Token.Token = Token
Token.String = String
Token.Number = Number
# SQL specific tokens
DML = Keyword.DML
DDL = Keyword.DDL
CTE = Keyword.CTE
可以发现这就是Token的识别解析类型码,通过该码就可以访问获得解析出的关键字了。
关于此基类又有五种主要的方法:
1.flatten
()
用于解析子组
for each_token in sql_tokens:
#list_ttype.append(each_token.ttype),list_value.append(each_token.value)
print(each_token.flatten())
2.match
(ttype, values, regex=False)
检查标记是否与给定参数匹配。
list_ttype=[]
list_value=[]
for each_token in sql_tokens:
#list_ttype.append(each_token.ttype),list_value.append(each_token.value)
print(each_token.match(each_token.ttype,each_token.ttype))
or运算为None匹配为True输出。
ttype是一种token类型。如果此标记与给定的标记类型不匹配。values是此标记的可能值列表。这些values一起进行OR运算,因此如果只有一个值与True匹配,则返回。除关键字标记外,比较区分大小写。为了方便起见,可以传入单个字符串。如果regex为True(默认值为False),则给定值将被视为正则表达式。
另外还有三种方法has_ancestor
(other),is_child_of
(other),within
(group_cls)这都有调用功能函数相关,可以先不用了解。
由此Token传入流单体已经差不多分析完,但是AST树该如何生成这是个问题,还有关于树的递归问题和层级问题,我们继续根据基类来慢慢摸清。这篇文章已经足够多内容了,先打住。下一篇再细讲。
点关注,防走丢,如有纰漏之处,请留言指教,非常感谢
以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见
写此sqlparse库的目的还是寻找在python编程内可行的SQL血缘解析,JAVA去解析Hive的源码实践的话我还是打算放到后期来做,先把Python能够实现的先实现完。上篇系列讲述的基于antrl解析说是用python其实还是太牵强了,无非就是使用PyJnius调用JAVA的类方法来实现,没有多大的意义来牵扯到Python编程。主要是HiveSQL的底层就是JAVA代码,怎么改写还是绕不开JAVA的。
python-
sqlparse-
解析SQL语句
sqlparse是用于
Python的非验证
SQL解析器。 它提供了对
SQL语句的
解析,拆分和格式化的支持。
该模块与
Python 3.5+兼容,并根据的条款。
访问项目页面,为以获取有关该项目的更多信息。
$ pip install
sqlparse
>> > import
sqlparse
>> > # Split a string containing two
SQL statements:
>> > raw = 'select * from foo; select * from bar;'
>> > statements =
sqlparse . split ( raw )
>> > statements
[ 'select * from foo;' , 'select * from bar;' ]
最近有一个需求是提取sql中的表名,网上搜了下解决方案,基本都是使用sqlparse去解析。然后研究了一下午,参考了一些其他的代码,搞了一个比较全的获取table_name的代码。网上很多都是不完整,例如:只有子查找,left join的表显示不了等等。
show code
import sqlparse
from sqlparse.sql import IdentifierList...
import pandas as pd
from
sqlalchemy import create_engine
warnings.filterwarnings('ignore')
DB_USERNAME = ''
DB_PASSWORD = ''
DB_HOST = ''
DB_PORT = '3306'
DB_NAME = 'information_schema'
DB_URI = '
mysql+pymy.
Apache Calcite 是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中。
Calcite的生前为Optiq(也为Farrago), 为Java语言编写, 通过十多年的发展, 在2013年成为Apache旗下顶级项目,并还在持续发展中, 该项...
https://github.com/alibaba/druid/wiki/Druid_SQL_AST
https://github.com/alibaba/druid/wiki/SQL-Parser
https://www.cnblogs.com/lay2017/p/9840394.html
https://blog.csdn.net/prestigeding/article/details/72318482
https://blog.csdn.net/zhxdick/article/details/51
一个数据分析团队往往会积累大量基于SQL的代码,用于日常的报表,模型数据提取,业务决策等等。有时随着公司的发展和技术更替,公司的数据仓库会进行迁移或重构,当表结构,字段名或者表名发生变化时,包含这些表的SQL代码就需要相应地进行改写。人为改写一段段业务代码,尤其是对字段或者表名的修改,往往比较重复而且容易遗漏。
懒惰是程序员的第一生产力,既然是重复的工作,那么有没有什么工具可以帮助我们自动化这一过程呢?
2 sqlparse开源库
2.1 介绍
想要改写SQL代码,关键的一步是对SQL进
sql = """
select K.a,K.b from (select H.b from (select G.c from (select F.d from
(select E.e from A, B, C, D, E), F), G), H), I, J, K order by 1,2;
import sqlparse
from sqlparse.sql import Ident...
aa=input("请输入一个字符串:")sql="select t1.cust_numr_no from stock_fah t0 left join sale_orde t1 on t0.origin=t1.name where t0.origin='%s'"%(aa)
print(sql)
1.此处通过MySQLdb来操作mysql,首先sudo apt-get install libmysqlclient-dev,如何出现 Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/dl.google.com_linux_chrome_deb_dists_stab
import pandas as pd
from sqlalchemy import create_engine
warnings.filterwarnings('ignore')
conn=create_engine("myqsl+pymys...
Python-docx 是一个 Python 用于创建 Microsoft Word (.docx) 文件的库。它可以创建包含文本、图片、表格、列表、样式及其它元素的 Word 文档。
使用 python-docx,可以通过代码动态地创建 Word 文档,而不需要手动打开 Word 并手动创建文档。不仅如此,python-docx 还可以处理并修改已存在的 Word 文档,例如修改文本内容、表格数据,添加图片和段落等等。
使用 python-docx,我们可以创建完成微软 Office 的电子文档,而不依赖人类的操作,比如报告、信函、契约等等。使用这个库,你可以轻松地将程序输出的文章转换为 Word 文档,并使其兼容于大部分使用 Word 的环境,非常方便。
此外,使用 python-docx 还可以轻松地操作 Word 样式。你可以通过代码创建、修改和选择所需的文本格式,使有机构标准的文档符合各种文件格式。
当然,python-docx 在处理大型文档时,可能会出现效率低下的问题,因为它只是 Python 生成的 Word 文档,在处理复杂的文本格式时,您需要进行更多的开发和调整来提高性能。
CSDN-Ada助手:
Python自动化测试小程序编程:Selenium库使用
qq_38220759: