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