我正在尝试使用 pyparsing 来构建一个有点不太像 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']]
因此,它看起来像是在按任一顺序解析组和顺序子句,但没有分配结果名称(给“顺序”和“组”)。我可以看到这完全是愚蠢的,我遗漏了一些东西,或者我可以看到我将以任何顺序(以及 future 的更多子句,如 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() ]
)
)
