python - 格式化 SQL 查询

标签 python mysql python-3.x

我有一个 SQL 查询字符串作为输入。我需要获取查询使用的所有表(例如 FROM tabletable1 INNER JOIN table2)。但查询不遵守任何标准。所以我的问题是是否有任何方法来格式化查询,以便搜索这些表名更容易。

我现在的方法是搜索关键字 from 和 join 并获取关键字之后的任何行(或者在 join 的情况下之前),但是查询中有异常(exception),其中 from 没有换行符之后我必须像这样对待每一个异常。我认为正则表达式不起作用,因为虽然表名称是 {schema_name.table_name} ,但也有类似的列。

for row in text:
    to_append = None
    split_row = row.strip('\r').strip(' ').strip('\r').split(' ')
    if split_row[-1].lower() == "from" and len(split_row) > 1:
        from_indexes.append(text.index(row))
    if ("join" in split_row or "JOIN" in split_row) and (split_row[-1] != "join" and split_row[-1]
                                                         != "JOIN"):
        for ind in range(len(split_row)):
            if split_row[ind].lower() == "join":
                to_append = split_row[ind + 1:]
                row = split_row[:ind + 1]
                row = ' '.join(row)
    rows.append(row.strip('\r').strip(' ').strip('\t'))
    if to_append is not None:
        rows.append(' '.join(to_append))

所以我正在寻找一些可以标准化 SQL 查询的方法,或者寻找另一种从查询中提取表名的方法。

最佳答案

我认为更直接的方法是使用正则表达式:

import re

sql = """select t1.*, t2.y, sq.z, table3.q from table1 t1 join
    table2 t2 on t1.x = t2.x left join
    (select 5 as x, 9 as z) sq JOIN
    table3 on sq.x = table3.x
;"""

matches = re.findall(r'(\s+(from|join)\s+)(\w+)', sql, re.DOTALL|re.IGNORECASE)
for match in matches:
    print(match[2])

请注意,它不会将(选择 5 作为 x,9 作为 z) 视为表格。

关于python - 格式化 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56733338/

相关文章:

php - 如何对多个 MySQL 表执行大查询?

java - 在语句中使用 sql 变量时突然出现 SQL 异常

mysql - SQL, Order By - 如何给其他列更多的权限?

python - PDF 响应在 Python 3 中损坏但在 Python 2 中有效

Python:变量 "tricking"try-exception,但适用于 if 语句

python - Skype4py 连接不起作用

python - Pygame 如何在按下按键时显示 "place"图像

python - python套接字模块中未定义的名称错误

Django 数据库创建或更新错误

python - 如何在Python中根据json文件的最新时间戳条件创建并写入文件?