编程语言
首页 > 编程语言> > python-pyparsing,每个结果名称

python-pyparsing,每个结果名称

作者:互联网

我正在尝试使用pyparsing来构建一些not-quite-sql解析器(我没有from子句,没有任何联接,等等).我今天的工作一直基于pyparsing附带的simpleSQL.py示例脚本.我试图将“ GROUP BY”和“ ORDER BY”子句添加到解析器中,但是无论它们先出现在哪,都试图对其进行匹配.

我正在使用Each类,它似乎与它们匹配,但是它没有在Each类中设置结果名称.我不是在做正确的事情,或者是发生了一些我不清楚的事情.

同样,从simpleSQL.py示例中,我删除了fromToken,所以我的selectStmt现在看起来像:

# define the grammar
selectStmt      << ( selectToken + 
                     columnNameList.setResultsName('columns') + 
                     Optional( CaselessKeyword('where') + whereExpression, "" ).setResultsName('where') + 
                     Each( [ Optional( CaselessKeyword('group by') + columnNameList, "" ).setResultsName('group'),
                             Optional( CaselessKeyword('order by') + columnNameList, "" ).setResultsName('order') ] ) )

我得到结果:

SELECT a WHERE a=b  and c = d GROUP BY c, e ORDER By d ->
tokens =  ['select', ['a'], 'where', ['a', '=', 'b'], 'and', ['c', '=', 'd'], 'group by', ['c', 'e'], 'order by', ['d']]

SELECT a WHERE a=b and c =d ORDER BY z, y GROUP BY c ->
tokens =  ['select', ['a'], 'where', ['a', '=', 'b'], 'and', ['c', '=', 'd'], 'order by', ['z', 'y'], 'group by', ['c']]

因此,看起来它正在按任一顺序解析group和order子句,但未分配结果名称(分别为“ order”和“ group”).我可以看到这完全是愚蠢的,我缺少了一些东西,或者我可以看到我打算以任何顺序查找那些子句(将来还会有更多子句,例如LIMIT)完全错误.

任何帮助将不胜感激!到目前为止,我喜欢pyparsing.

解决方法:

试一下:

Stmt      << ( selectToken +
                columnNameList('columns') + 
                Optional( CaselessKeyword('where') + whereExpression('where'), "" ) +
                Each( [ Optional( CaselessKeyword('group by') + columnNameList('group'), "" ).setDebug(),
                        Optional( CaselessKeyword('order by') + columnNameList('order'), "" ).setDebug() ] 
                    ) 
            )

标签:pyparsing,python,sql
来源: https://codeday.me/bug/20191011/1895473.html