解析复杂的查询参数

时间:2010-05-27 06:04:54

标签: python database parsing

我的Python服务器接收的作业包含要对其采取行动的项目列表,而非搜索查询术语;输入示例:

(Customer:24 OR Customer:25 OR (Group:NW NOT Customer:26))

因此,当提交作业时,我必须解析此收件人模式并解析所有匹配的客户,并使用该输入创建作业。

要使问题复杂化,客户可以随时加入和离开小组,并且当这种情况发生时,应立即更新作业。

因此,当团体更改成员资格时,我必须通知所有当前正在运行的工作(并且他们会做他们的事情)。

如何最好地解析,应用和存储(在我的RDBMS中)这种约束列表?

  • 解析:eval(),手写的FSM吃字符,yacc / bison /?或?
  • 申请:您将如何存储这些约束并对其进行评估?
  • 存储:在数据库中,每个术语一行,带有一个评估顺序和一个NOT / AND / OR操作字段;还是作为一个blob?

2 个答案:

答案 0 :(得分:1)

我建议使用pyparsing(http://pyparsing.wikispaces.com/),它可以让你整齐地描述一个语法,并为你提供一个充满数据的树。然后,希望您的语法足够接近SQL,以便您可以从解析结果中轻松地形成“where”子句。

您可以挑选并存储已解析的树,未解析的请求或现成的SQL子句。这取决于您获取和重用它们的频率,以及是否需要通过其他方式检查数据库并查看查询。我认为以非blob格式存储查询是没有意义的,除非你想针对它们运行有趣的选择 - 如果你这样做,你可能需要一个XML数据库或其他容易支持树的东西。

答案 1 :(得分:0)

考虑使用SQL而不是发明另一种迷你语言:

(
cust.id = 24
or cust.id = 25
or (cust.id = cust_group.cust_id and cust_group.id = 'NW' and cust.id != 26)
) // or somthing similar

SQL注入问题?你需要解析它(如果你的表达被适当限制,不要太难)并且无论用什么语言都要检查它是否合理。