gpt4 book ai didi

mysql - 如何在 Django 中使用 MySQL 用户定义函数 (UDF)?

转载 作者:行者123 更新时间:2023-11-29 01:04:51 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何构建一个 Django 过滤器,其中包含依赖于 MySQL 中定义的用户定义函数 (UDF) 的术语。

我的 UDF 处理计算化学的一个分支,称为化学信息学。其中一个函数 (oe_matches) 让我可以测试子结构(表示为“SMARTS”字符串)是否与结构(表示为“SMILES”字符串)匹配。您可以将它们视为与匹配字符串的正则表达式同构。

在我的数据库中,我有一个名为“节点”的主题表。这包含有关研究主题的可搜索文本。该主题中的一些信息涉及分子。我有一张分子表。分子可以属于多个主题,而主题可以涉及多个分子,所以我有:

class Node(models.Model):
title = models.CharField()
content = models.CharField()

class Structure(models.Model):
smiles = models.CharField(max_length=255)
nodes = models.ManyToManyField(Node)

现在我想搜索标题或内容中包含“test”的所有节点,匹配 SMARTS 模式“[C;!H0]”(即带有 at 的碳至少一个氢)。

理想情况下,我想这样写:

q = ((models.Q(title__icontains="test") |
models.Q(content__icontains="test")
).filter(models.Q(structure__node_smiles = oe_match(smarts="[C;!H0]")))
)

其中 oe_match 知道如何为 MySQL 生成正确的后端代码,在本例中为 'oe_match("[C;!H0]", Structure.smiles)',而 Django 在其中看到 structure__node_smiles 并执行其操作使各个部分组合在一起的多对多魔法。

我看到我可以通过 raw() 接口(interface)得到我想要的东西(模次语法错误和使用错误的连接类型):

SELECT * FROM Node, Node_Structure, Structure WHERE
((Node.title LIKE "%test%" OR Node.content LIKE "%test%") AND
(Node.id = Node_Structure.node AND
Node_Structure.structure = Structure.id) AND
oe_matches("[C;!H0]", Structure.smiles));

我宁愿不要以这种方式混合和匹配我的数据库层。另外,我必须进行一些代码重组。 (目前我创建了一个过滤器,稍后将其传递给搜索模型。)

从长远来看,我希望其他人将我的 MySQL UDF 用于化学信息学,并且我认为为我的潜在用户(除了与我一起工作的另外两个人)提供一些高级 Django 调用会很好,所以即使我可以用 raw() 解决眼前的问题,我仍然想知道一个长期的高级解决方案。

最佳答案

使用 QuerySet.extra,它很乐意采用您的自定义函数(使用 where 关键字参数)。

http://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

关于mysql - 如何在 Django 中使用 MySQL 用户定义函数 (UDF)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704847/

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