使用pyparsing进行SQL解析

2023-12-24

过去几周我正在学习 PyParsing。我打算用它从 SQL 语句中获取表名。 我看过http://pyparsing.wikispaces.com/file/view/simpleSQL.py http://pyparsing.wikispaces.com/file/view/simpleSQL.py。但我打算保持语法简单,因为我并不试图解析 select 语句的每个部分,而是只查找表名。此外,为任何商业可用的现代数据库(如 Teradata)定义完整的语法也非常复杂。

#!/usr/bin/env python

from pyparsing import *
import sys

semicolon = Combine(Literal(';') + lineEnd)
comma = Literal(',')
lparen = Literal('(')
rparen = Literal(')')

# Keyword definition
update_kw, volatile_kw, create_kw, table_kw, as_kw, from_kw, \
where_kw, join_kw, left_kw, right_kw, cross_kw, outer_kw, \
on_kw , insert_kw , into_kw= \
    map(lambda x: Keyword(x, caseless=True), \
        ['UPDATE', 'VOLATILE', 'CREATE', 'TABLE', 'AS', 'FROM',
         'WHERE', 'JOIN' , 'LEFT', 'RIGHT' , \
         'CROSS', 'OUTER', 'ON', 'INSERT', 'INTO'])

# Teradata SQL allows SELECT and well as SEL keyword
select_kw = Keyword('SELECT', caseless=True) | Keyword('SEL' , caseless=True)

# list of reserved keywords
reserved_words = (update_kw | volatile_kw | create_kw | table_kw | as_kw |
                  select_kw | from_kw | where_kw | join_kw |
                  left_kw | right_kw | cross_kw | on_kw | insert_kw |
                  into_kw)

# Identifier can be used as table or column names. They can't be reserved words
ident = ~reserved_words + Word(alphas, alphanums + '_')

# Recursive definition for table
table = Forward()
# simple table name can be identifer or qualified identifier e.g. schema.table
simple_table = Combine(Optional(ident + Literal('.')) + ident)
# table name can also a complete select statement used as table
nested_table = lparen.suppress() + select_kw.suppress() + SkipTo(from_kw).suppress() + \   
               from_kw.suppress() + table + rparen.suppress()
# table can be simple table or nested table
table << (nested_table | simple_table)
# comma delimited list of tables
table_list = delimitedList(table)
# Building from clause only because table name(s) will always appears after that
from_clause = from_kw.suppress() + table_list


txt = """
SELECT p, (SELECT * FROM foo),e FROM a, d, (SELECT * FROM z), b
"""
for token, start, end in from_clause.scanString(txt):
    print token

这里值得一提的是。我使用“SkipTo(from_kw)”来跳过 SQL 语句中的列列表。这主要是为了避免为列列表定义语法,列列表可以是逗号分隔的标识符列表、许多函数名称、DW 分析函数等等。通过这个语法,我可以解析上面的语句以及 SELECT 列列表或表列表中的任何级别的嵌套。

['foo']
['a', 'd', 'z', 'b']

当 SELECT 有 where 子句时,我遇到问题:

nested_table = lparen.suppress() + select_kw.suppress() + SkipTo(from_kw).suppress() + \   
               from_kw.suppress() + table + rparen.suppress()

当 WHERE 子句存在时,相同的语句可能如下所示: SELECT ... FROM a,d , (SELECT * FROM z WHERE (c1 = 1) and (c2 = 3)), p 我想将“nested_table”定义更改为:

nested_table = lparen.suppress() + select_kw.suppress() + SkipTo(from_kw).suppress() + \   
               from_kw.suppress() + table + Optional(where_kw + SkipTo(rparen)) + rparen

但这不起作用,因为它与“c = 1”后面的右括号匹配。我想知道的是如何跳到与“SELECT * FROM z...”之前的左括号匹配的右括号,我不知道如何使用 PyParsing 来做到这一点

另外,我还寻求一些建议,以了解从复杂的嵌套 SQL 中获取表名的最佳方法。非常感谢任何帮助。

谢谢 阿比吉特


考虑到您还尝试解析嵌套的 SELECT,我认为您无法避免编写一个相当完整的 SQL 解析器。幸运的是,Pyparsing wiki Examples 页面上有一个更完整的示例,select_parser.py https://github.com/pyparsing/pyparsing/blob/master/examples/select_parser.py。我希望这能让你走得更远。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用pyparsing进行SQL解析 的相关文章

  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • 如何将SQL数据加载到Hortonworks中?

    我已在我的电脑中安装了 Hortonworks SandBox 还尝试使用 CSV 文件 并以表结构的方式获取它 这是可以的 Hive Hadoop nw 我想将当前的 SQL 数据库迁移到沙箱 MS SQL 2008 r2 中 我将如何做
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • SQL 标准是否允许函数名和括号之间有空格

    检查一些 RDBMS 我发现类似的事情 SELECT COUNT a SUM b FROM TABLE 允许 注意聚合函数和括号之间的空格 谁能提供一个指向 SQL 标准本身定义的指针 任何版本都可以 编辑 以上在postgres中工作 m
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • SQL Server使用in关键字传递字符串数组查询

    我认为 IN 子句不能接受具有多个值的绑定参数 Oracle 不能 需要几分钟 查询是 declare setting varchar max set setting Sales Entry Grid Cursor Customer Man
  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • 处理与不同相关实体的一对多的正确模式

    我有一个 C 项目 我使用实体框架作为 ORM 我有一个User 可以向多家银行付款 每家银行都是一个独立的实体 并且每家银行都由不同的字段描述 问题是 一User可以没有或有很多不同的Banks 我不太确定如何对此进行建模 临时解决方案是
  • ALTER TABLE 语句与 FOREIGN KEY 约束冲突

    为什么要添加外键tblDomare表导致此错误 ALTER TABLE 语句与 FOREIGN KEY 约束 FK tblDomare PersN 5F7E2DAC 冲突 冲突发生在数据库 almu0004 表 dbo tblBana 列
  • SQL:如何从一个表中获取另一个表中每一行的随机行数

    我有两个数据不相关的表 对于表 A 中的每一行 我想要例如表 B 中的 3 个随机行 使用光标这相当容易 但速度非常慢 那么我该如何用单个语句来表达这一点以避免 RBAR 呢 要获得 0 到 N 1 之间的随机数 可以使用 abs chec
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符

随机推荐

  • 相当于 mac os X 上的 strace -feopen

    这对于调试很有用 因此与编程相关 在linux上 我们可以使用命令 strace feopen python myfile py 找出加载了哪些 python 模块和共享对象 macOS X 上是否有等效的单行代码 我想你的意思是strac
  • CentOS 中 Apache 没有权限错误

    我已经在 centos 6 中安装了 apache 2 2 当 apache 文件夹位于默认位置时 一切正常 var www html 然后我在我的用户主文件夹中配置了一个虚拟主机 之后 apache 开始显示Forbidden You d
  • 在 WordPress 中获取随机帖子

    如何在 WordPress 中获得随机帖子 我想在页面上显示一个按钮 按下该按钮后 会转到博客中的随机帖子 我不想在页面上显示随机帖子 我只想要一个指向该帖子的链接 我尝试在 Google 和 stackoverflow 上搜索代码 但没有
  • 连接 gsub [重复]

    这个问题在这里已经有答案了 我当前正在运行以下代码来清除数据中的重音字符 df lt gsub A df df lt gsub E df df lt gsub I df df lt gsub O df df lt gsub U df df
  • 解组字符串化的 json

    我正在尝试使用嵌套 json 来解组 json 我正在使用这个结构 type atomRequest struct Stream string json stream Data map string interface json data
  • 为什么当触摸手势持续很短时间时,UITableViewCell 上的 UIButton 只会绘制得更暗

    快速按下按钮并且短时间按住按钮不会突出显示 不同于一个UIButton在一个共同的UIView 就像官方 Twitter 客户端中的头像一样出现了同样的问题 Instagram 客户端似乎解决了这个问题 所有按钮都工作正常 在这里找到同样的
  • NSData:在解包可选值时意外发现 nil

    这可能是基本的 swift 问题 但我是 swift 或 iOS 开发的新手 我收到错误fatal error unexpectedly found nil while unwrapping an Optional value 对于下面的函
  • 如何使用 Intel 内在函数检查 CPU 是否支持 AVX 扩展?

    我正在使用英特尔内在函数编写程序 我想用 mm permute pd内在的 仅在具有 AVX 的 CPU 上可用 对于没有 AVX 的 CPU 我可以使用 mm shuffle pd但根据规格 它比 mm permute pd Intel
  • 客户端可以取消 Web Api 请求吗?

    我的 Web api 控制器中有以下方法 长时间运行的方法支持取消令牌 即如果请求取消 它们将不会运行 public async Task
  • MahApps - 如何禁用默认按钮的自动大写

    我已经开始介绍了MahApps Metro 真的很棒 在我的 WPF 应用程序中 我最喜欢的按钮是默认按钮 问题是它把我的所有文本都变成大写 而我不想要它 您可以通过设置所有按钮的属性来覆盖默认值Window Resources
  • 从给定坐标提取 PDF 文本

    我想使用 Ghostscript 从 PDF 的一部分 使用坐标 中提取文本 谁能帮我吗 是的 有了 Ghostscript 您can从 PDF 中提取文本 但不 它不是完成这项工作的最佳工具 不 您不能在 部分 单个页面的部分 中执行此操
  • 如何在 Ubuntu 中使用 postgres 允许访问 CSV 文件

    我正在使用以下命令 copy select so name so date order sol name sol product Id sol product uom qty ai number ai date invoice so amo
  • 我无法修复 GUI 的小问题。 JTextFields

    Small error I can t manage to do So right now my program GUI looks like this 现在 标记 列下有一个文本字段 用户可以在其中输入数据 如果我想在 重量 列下方插入一
  • Scala 中方法类型参数化中的结构类型?

    考虑以下 Scala 代码 例如 在 REPL 中 object A def foo Unit object B def foo Unit def bar T lt Any def foo Unit param T Unit param f
  • 如何强制scipy的optimize模块的函数同时取函数及其梯度

    我有一个相当复杂的函数 f x 想要优化 并且我正在使用 Scipy 的 scipy optimize 模块中的 fmin bfgs 函数 它迫使我分别给出最小化函数和梯度函数 f x 这很遗憾 因为梯度的一些计算可以在评估函数 f x 时
  • 在循环内读取是/否选项,不起作用

    while read line do read p Are you alright y n RESP if RESP y then echo Here i want to do something but prompt does not w
  • ASP.NET 代码文件、代码隐藏和继承

    我的困惑在这里或在网络上并不新鲜 但是 我有一些问题我在任何地方都找不到答案 第一个问题是 为什么 CodeFile 需要继承 而 CodeBehind 不需要继承 I read http msdn microsoft com en us
  • SKLabelNode 文本具有两种不同的字体和颜色。这怎么可能?

    我有一个SKLabelNode设置为显示分数变量 后跟高分变量 scoreLabel text score classicHScoreInt 现在 一切都显示良好 但我希望 classicHScoreInt 的字体更小 也许是不同的颜色 这
  • jQuery ajax 返回readyState 1或不正确的数据类型

    我为 WordPress 插件编写脚本 但 ajax 响应有问题 当我想要获取 json 文件时 jQuery ajax 返回 readyState 1 jQuery ajax 与async false返回纯文本 尽管我有dataType
  • 使用pyparsing进行SQL解析

    过去几周我正在学习 PyParsing 我打算用它从 SQL 语句中获取表名 我看过http pyparsing wikispaces com file view simpleSQL py http pyparsing wikispaces