我正在尝试使用 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']]
因此,看起来它正在以任一顺序解析 group 和 order 子句,但没有分配结果名称(分配给“order”和“group”)。我可以看到这完全是愚蠢的,并且我遗漏了一些东西,或者我可以看到我要以任何顺序查找这些子句(以及将来的更多子句,例如 LIMIT)完全错误。
任何帮助将不胜感激!到目前为止,我很喜欢 pyparsing。