分割SQL语句

sqlparse.split(sql,encoding = None )

​sql​​​ - 包含一个或多个SQL语句的字符串
​​​encoding​​ - 语句的编码(可选)

sql = 'select * from foo; select * from bar;'
sql_list = sqlparse.split(sql)
print(sql_list)

美化sql

sqlparse.format(sql,encoding = None, ** options )

format()函数接受关键字参数

  1. ​keyword_case​​​ 关键词​​upper​​、​​lower​​sql的保留字大小写
  2. ​identifier_case​​​ 标识符的​​upper​​、​​lower​​大小写
  3. ​strip_comments=Ture​​删除注释
  4. ​reindent=Ture​​美化sq缩进语句发生改变
sql = "select * from foo where id in (select id from bar);"
sqlpe = sqlparse.format(sql, reindent=True, keyword_case='upper')
print(sqlpe)


SELECT *
FROM foo
WHERE id IN
(SELECT id
FROM bar);

基类

所有返回的对象都从这些基类继承。在​​Token​​​此类表示单个令牌和 ​​TokenList​​类是一组令牌。后者提供了检查其子类的方法

1.​​Token​

sqlparse.sql.Token(ttype,value )

它表示单个标记,并具有两个实例属性:
​​​value​​​标记的未更改值,是标记​​ttype​​的类型。

  1. ​flatten()​​解决分组
  2. ​has_ancestor(other)​​如果其他的再其父类中,则返回
  3. ​is_child_of(other)​​如果标记是其他标记的子标记,则返回
  4. ​match(ttype, values, regex=False)​
  5. ​within(group_cls)​
sql = 'select * from "someschema"."mytable" where id = 1'

parsed = sqlparse.parse(sql)
stmt = parsed[0].tokens
for token in stmt:
print(token.ttype, token.value)

返回结果如下

Token.Keyword.DML select
Token.Text.Whitespace
Token.Wildcard *
Token.Text.Whitespace
Token.Keyword from
Token.Text.Whitespace
None "someschema"."mytable"
Token.Text.Whitespace
None where id = 1

Token子类类型

  1. ​sqlparse.sql.Token​
  2. ​sqlparse.sql.Where​
  3. ​sqlparse.sql.Identifier​
  4. ​sqlparse.sql.IdentifierList​

token.ttype属性(sqlparse.sql.Token)

  1. ​Token.Keyword.DDL​​​ 标记语法​​create​​语句
  2. ​Token.Keyword.DML SELECT​​​标记法 ​​select​​​、​​updata​​​、​​delete​
  3. ​Token.Keyword​​ SQL保留的关键字
  4. ​Token.Text.Whitespace​​ 空格,sql语句间的空格
  5. ​Token.Text.Whitespace.Newline​​ sql新的一行间空格
  6. ​Token.Punctuation​​​ 结束标点通常为​​;​

2.​​TokenList​

一组令牌,t其有一个额外的属性tokens,包含子标记列表

flatten()
get_alias()
get_name()
get_parent_name()
get_token_at_offset(offset)
group_tokens(grp_cls, start, end, include_end=True, extend=False)
has_alias()
insert_after(where, token, skip_ws=True)
insert_before(where, token)
token_first(skip_ws=True, skip_cm=False)
token_index(token, start=0)
token_next(idx, skip_ws=True, skip_cm=False, _reverse=False)
token_prev(idx, skip_ws=True, skip_cm=False)

SQL表示类(SQL语句的不同部分)

  • 判断sql的类型DML/​DDL​
sqlparse.sql.Statement(tokens = None )

​get_type()​​语句的类型

sql = sqlparse.sql.Statement(stmt)
print(sql.get_type())

返回SQL标记关键字​​SELECT​​​、​​select​​​、​​updata​​​、​​delete​​​、​​create​

  • Identifier标识符
sqlparse.sql.Identifier(tokens = None )

​get_array_indices()​​​返回索引标记列表的迭代器
​​​get_ordering()​​​返回排序或None大写字符串
​​​get_typecast​​​None以字符串形式返回类型转换或此对象
​​​is_wildcard​​True如果此标识符包含通配符,则返回

  • IdentifierList标识符列表
sqlparse.sql.IdentifierList(tokens = None)

​get_identifiers​​返回标识符, 不包含空格和标点符号

  • where语句
sqlparse.sql.Where(tokens = None )
  • 一个或多个WHEN且可能是ELSE部分的CASE语句
sqlparse.sql.Case(tokens = None )

​get_cases(skip_ws = False )​​​返回两个元组的列表(条件,值)
if else 存在 条件是None

  • 括号之间的标记
sqlparse.sql.Parenthesis(tokens = None )
  • 带有else if​或​else​部分的​if​子句​
sqlparse.sql.If(tokens=None)
  • FOR循环
sqlparse.sql.For(tokens = None )
  • var:= val;这样的赋值
sqlparse.sql.Assignment(tokens = None )
  • WHERE子句中使用的比较
sqlparse.sql.Assignment(tokens = None )