【问题标题】:Custom, user-definable "wildcard" constants in SQL database search -- possible?SQL 数据库搜索中自定义的、用户可定义的“通配符”常量——可能吗?
【发布时间】:2021-06-23 16:02:36
【问题描述】:

我的客户正在使用我编写的 django webapp 进行数据库搜索。该查询将正则表达式搜索发送到数据库并输出结果。

由于正则表达式搜索可能会很长且不直观,因此客户要求为正则表达式搜索创建某些自定义“通配符”。例如。

Ω := [^aeiou](所有非元音)

等等

这可以通过在查询中进行简单的永久字符串替换来实现,例如

query = query.replace("Ω", "[^aeiou]")

对于替换列表中的所有元素。这似乎应该是安全的,但我不太确定。

他还要求用户可以为他们的搜索动态定义自定义通配符。这样就会有一些其他的输入框供用户定义

∫ := some other regex

为了存储它们,您可以创建一个模型

class RegexWildcard(models.Model):
    symbol = ...
    replacement = ...

我个人对此有点警惕,因为它似乎并没有增加很多功能,但似乎确实给代码增加了很多复杂性和潜在问题。客户现在可以将他们的查询写入数据库。它们可以覆盖彼此的符号吗?

我以前从未在任何地方看到过这种做法,这也让我对这个想法有些警惕。

这可能吗?可取的?好主意?一个可怕的想法?资源和任何指导表示赞赏。

【问题讨论】:

    标签: sql django


    【解决方案1】:

    嗯,你是按小时计酬的......

    我看不出涉及希腊字母对任何人都有什么好处。如果查询存储在任何地方,那么接近系统的每个人都必须学习新语法才能理解它们。另外,还有如何输入特殊符号的问题。

    如果客户创建了他们希望能够重用的复杂正则表达式,这是可以理解的。您的应用程序可以维护用户可以添加和选择的此类表达式的列表。理论上,用户会“点击”一个表达式,它会被插入到查询中。

    保存的表达式可以具有用户定义的名称,以使它们更容易记住和引用。您可以定义引用它们的语法,否则在 SQL 中是无效的,例如 ::name。在向 DBMS 提交查询之前,您需要用正则表达式替换名称。 你仍然有选择好名字和培训的问题。

    为了防止 SQL 格式错误,我想您需要确保正则表达式有效。您不希望您的系统将; drop table CUSTOMERS; 存储为“正则表达式”!您必须验证表达式,或者,如果可以,将正则表达式 视为数据 在参数化查询中。

    不过,对我来说真正的问题是,为什么您会使用标准化的正则表达式查询。这种需求暗示了一个数据库设计问题:它表明被查询的列是由复合数据组成的,并且应该表示为可以直接查询的多个列,而无需使用正则表达式。

    【讨论】:

    • 最后一部分真的很有趣。我想考虑一下。谢谢。事实上,我没有按小时获得报酬:-)
    猜你喜欢
    • 2012-02-22
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多