gpt4 book ai didi

python - 在python上实现查询语言

转载 作者:太空宇宙 更新时间:2023-11-03 12:01:04 25 4
gpt4 key购买 nike

我正在寻找一种方法,在我的工作场所向其他开发人员和可选的客户公开过滤功能。

问题

我想基于用户定义的过滤器对我的数据(python 字典)实现一种简单的查询语言,该过滤器公开给我的其他开发人员,然后再公开给我们的客户。

  • 语言应该足够简单,非开发人员也能使用
  • 足够安全,可以避免在我的服务器上远程执行代码
  • 表现力足以像下面的例子一样查询数据

在我的 dict/json 数据上公开 SQL 接口(interface)会很棒(我不想设置服务器)

示例场景

db = [
{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']},
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']},
{'first': 'danny', 'last': 'foo', 'likes': ['http', 'donuts']},
]

query = '(first == "john" or last == "doe") and likes contains "cookies"'
results = run_query(db, query)

这应该返回(在结果中):

[
{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']},
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']},
]

注意:我不介意更改运算符(operator)名称,例如or -> OR contains -> inside 或其他任何东西,只要它是人类可读的并且保持相同的语言表达能力

我尝试过的解决方案

数字用户线

我查看了一些 DSL 库,例如 PLY但在我看来它们太复杂并且需要一些魔法来完成事情(不确定从哪里开始以及是否值得)

插件

没有找到任何插件系统来为我的用户公开沙盒功能(即更安全的评估)

JSON 查询包

我看了TinyDB以及其他通过 json 实现某种 SQL 但无法在没有大量自定义的情况下找到工作的东西。我也看了pandasql整体上看起来不错但没有维护的库 :(

有一个 lucene 包解析器 - luqum基于 PLY 但它与我的语法树不同(它们有更多方法)并且库没有真正维护,(我确实考虑稍微操纵这个库以获得我想要的)

SQLite

使用 SQLiteDB 加载我的所有数据(无论是否在内存中),然后对其运行 SQL 查询。没有测试它,但这应该非常简单,缺点是将我的整个数据加载到 SQL 中只是为了运行我不想做的数据。

我乐于接受建议,甚至愿意接受有关如何改进上述解决方案以实现这项工作的建议

最佳答案

在将 PLY 用于基于文本的查询之前,我会像这样从常规 Python 类构建核心语言:

class Match:
def __init__(self, **target):
[[self.key, self.value]] = target.items()
def __call__(self, obj):
return self.key in obj and self.value == obj[self.key]

class Contains:
def __init__(self, **target):
[[self.key, self.value]] = target.items()
def __call__(self, obj):
return self.key in obj and self.value in obj[self.key]

class Or:
def __init__(self, *predicates):
self.predicates = predicates
def __call__(self, record):
return any(predicate(record) for predicate in self.predicates)

class And:
def __init__(self, *predicates):
self.predicates = predicates
def __call__(self, record):
return all(predicate(record) for predicate in self.predicates)

def run_query(db, query):
return filter(query, db)

if __name__ == '__main__':

db = [
{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']},
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']},
{'first': 'danny', 'last': 'foo', 'likes': ['http', 'donuts']},
]
query = And(Or(Match(first='john'), Match(last='doe')), Contains(likes='cookies'))
for result in run_query(db, query):
print(result)

这个输出:

{'first': 'john', 'last': 'doe', 'likes': ['cookies', 'http']}
{'first': 'jane', 'last': 'doe', 'likes': ['cookies', 'donuts']}

关于python - 在python上实现查询语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com