解析SQL查询文本以提取使用的表名称

时间:2015-04-12 16:18:36

标签: python sql regex

我有一个由不同进程填充的sqlite数据库。此过程在数据库中生成表,并用数据填充它们。

我正在尝试对此数据库应用一组预先编写的查询,但我需要确保在运行它之前在数据库中创建查询中引用的所有表以防止错误。我试图确定在SQL中引用表的所有可能方法,以确保我涵盖所有选项。

简单:

select col1 from table1

联接:

select col1,col2 from table1 join table2 on col1 = col2
select col1,col2 from table1 left outer join table2 on col1 = col2
select col1,col2 from table1, table2 on col1 = col2
select col1,col2 from table1, table2 where col1 = col2

子查询:

select col1,(select col2 from table2 where col1 = col2) as ag2 from table1
select col1 from table1 where col1 in (select col2 from table2)

别名:

select col1,col2 from table1 t1, table2 t2 where col1 = col2
select col1,col2,col3 from table1 t1, table2 t2,table3 t3 where col1 = col2

我正在考虑使用RegEx来识别少数事件。

from [table] [alias]
join [table] [alias]
from [table] [alias], [table] [alias]

此RegEx似乎解释了大部分差异。表名出现在group2或group3中:

(from|join)\s+([\w]+)|,\s*([\w]+)\s*([\w]\s*)?(on|where)

http://regexr.com/3aq8j

我的问题:

  • 我是否确定了在查询中使用表的所有可能方法?
  • 我的表情还有其他误报吗?
  • 我无法从别名部分获取所有表名。帮助
  • 有没有比RegEx更好的方法?

如果这会影响RegEx的格式,我将在Python代码中使用它。

1 个答案:

答案 0 :(得分:1)

您可以使用positive look-behind

(?<=from|join)\s+(\w+)(,\s*(\w+))?(?:(\s*\w+,\s*(\w+))+)?

注意您需要正确使用分组。在您的模式中,您已在组中放置fromjoin,因此结果将包含它们。