我有一个作为SQL查询的字符串作为输入。我需要获取查询使用的所有表(例如FROM table 或 table1 INNER JOIN table2 )。但是查询不遵守任何标准。所以我的问题是,是否有任何方法可以格式化查询,以便更轻松地搜索这些表名。
我现在的方法是从中搜索关键字并加入,并在关键字之后(或在连接的情况下,在关键字之后)加上任何一行,但是查询中有例外,其中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查询的方法,或者寻找另一种从查询中提取表名的方法。
答案 0 :(得分:0)
您应该使用ORM工具进行更清晰的查询(请参见https://en.wikipedia.org/wiki/Object-relational_mapping)。或至少一些查询构建器模块。
我最近在https://pypi.org/project/eloquent/处发现了重造的幼虫“雄辩的” Orm。
像PeeWee这样的其他ORM也很常见。
答案 1 :(得分:0)
我认为更简单的方法是使用正则表达式:
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)作为表格。