gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:47:17 24 4
gpt4 key购买 nike

我有一个由不同进程填充的 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

我正在考虑使用正则表达式来识别少数出现的情况。

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

这个正则表达式似乎解释了大部分差异。表名称出现在 group2 或 group3 中:

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

http://regexr.com/3aq8j

我的问题:

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

如果它影响正则表达式的格式,我将在 Python 代码中使用它。

最佳答案

您可以使用 positive look-behind :

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

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

关于python - 解析 SQL 查询文本以提取使用的表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29591622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com