2

我正在尝试使用 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。

4

1 回答 1

1

试一试:

Stmt      << ( selectToken +
                columnNameList('columns') + 
                Optional( CaselessKeyword('where') + whereExpression('where'), "" ) +
                Each( [ Optional( CaselessKeyword('group by') + columnNameList('group'), "" ).setDebug(),
                        Optional( CaselessKeyword('order by') + columnNameList('order'), "" ).setDebug() ] 
                    ) 
            )
于 2011-07-22T22:32:17.937 回答