Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 构建DSL查询语言_Python_Django_Dsl - Fatal编程技术网

Python 构建DSL查询语言

Python 构建DSL查询语言,python,django,dsl,Python,Django,Dsl,我正在做一个项目(用Django编写),它只有几个实体,但每个实体都有很多行 在我的应用程序中,我有几个直接用纯SQL编写的静态“报告”。用户还可以通过通用筛选表单搜索数据库。由于目标受众非常精通技术,而且有时过滤器不适合他们的需要,因此我考虑为我的数据库创建一种查询语言,如or 我发现了和,但它们似乎只对内存中的对象进行操作。由于数据库可能太大,无法将其保存在内存中,因此我更希望在执行实际工作之前将查询翻译成SQL(或者更好地说是Django查询) 有没有关于如何做到这一点的库或最佳实践?我正

我正在做一个项目(用Django编写),它只有几个实体,但每个实体都有很多行

在我的应用程序中,我有几个直接用纯SQL编写的静态“报告”。用户还可以通过通用筛选表单搜索数据库。由于目标受众非常精通技术,而且有时过滤器不适合他们的需要,因此我考虑为我的数据库创建一种查询语言,如or

我发现了和,但它们似乎只对内存中的对象进行操作。由于数据库可能太大,无法将其保存在内存中,因此我更希望在执行实际工作之前将查询翻译成SQL(或者更好地说是Django查询)


有没有关于如何做到这一点的库或最佳实践?

我正面临着这个问题——一个需要搜索的大型数据库。我使用(django非常简单)和您一样,制作了一些静态报告和一些奇特的过滤器

然而,超级用户却在叫嚣着要更多。我决定已经有了一个他们都知道的答案-。问题是如何使它足够安全

因此,我使用django权限授予超级用户在新表中进行SQL查询的权限。然后,我提出了一个观点,让不太强大的用户使用这些查询。我让他们选择可选参数。查询是使用Python的较低级别运行的,django在其ORM的后台使用该级别

真正的诀窍是打开一个只读数据库连接来运行这些查询,以确保不会运行任何更新。我通过在数据库中创建具有较低权限的其他用户并在视图中打开该用户的特定连接来建立只读连接


TL;DR-SQL是一条路要走

根据数据的形式、用户需要使用的查询类型以及数据更新的频率,Nick Craig Wood建议的纯SQL解决方案的另一种替代方案是为数据编制索引,然后对其运行查询


Solr增加了复杂性(配置、数据同步),但速度非常快,可以处理大型数据集,并提供(相对)直观的查询语言

实际上,您可以使用编写自己的SQL语言。你甚至可以对其进行详细的扩展。

编写这样一个DSL实际上非常容易,而且在Django中已经有一个例子可以用来做你想做的事情。你看,Django有一个奇特的东西叫做a,它使Django查询方面的事情变得相当简单

在DjangoCon EU 2012上,Matthieu Amiguet举行了一场题为“在Django应用程序中实现特定于域的语言”的会议,他在会上介绍了整个过程,直到实现您想要的DSL。最终的代码(无论如何,链接到上一张幻灯片中的)可在上找到

莱诺特·范里斯也制作了一些。(他通常会这么做!)这些内容涵盖了一些缺失的背景

在这里,您可以看到与示例中的YQL和JQL非常相似的内容:

  • groups\uu name=“XXX”而非groups\uu name=“YYY”
  • (已修改>2011年1月4日或未声明)和组
它也可以很容易地调整;例如,您可能希望使用
groups.name
,而不是
groups\uu name
(我愿意)。这种修改非常简单(在
p\u expression\u ID
中构造
Q
对象之前,在字段标记中允许
,方法是修改
t\u字段
,然后将
替换为


因此,这满足了简单的查询;如果您希望创建更复杂的DSL,它还为您提供了一个良好的起点。

您可以将此Zope附加组件视为exmaple:但SQL已经是DSL)我已经考虑过添加原始SQL查询的可能性,但我对此不太满意。以快速和智能的方式执行SQL查询有时真的很棘手。因此,我(和您)可能最终执行的查询会给数据库带来很大的负载。您必须确保sql接口不允许您从其他表中选择数据,否则最终会出现信息泄露漏洞(->更复杂的管理)。然而,即使是精通技术的人也可能不知道(或不想知道)SQL。我认为一个成熟的搜索框架是一个很大的滥杀滥伤(因为上面提到的复杂性)。数据会定期更新,因此需要大量的代码/逻辑来保持数据存储的同步。谢谢您的回答。不幸的是,这个项目的进一步开发已经被搁置,所以我现在无法尝试。然而,从快速查看来看,这似乎是一个很好的解决方案。如果发展继续下去,我一定会尝试这个,并且会很高兴地接受你的回答。我在这个问题上打开了bounty,因为我需要完全相同的东西。这个答案对我来说似乎很精彩,正是我一直在寻找的。这些幻灯片非常有用。下周我将深入研究这个问题,希望我能很快验证这个方法并奖励你。这正是我想要的。这将导致搜索结果或报告,使Django模型更加强大。我猜我们都被吉拉宠坏了:)