跳转到主要内容

MoSQL的Django模型集成。

项目描述

https://travis-ci.org/uranusjr/django-mosql.png?branch=master

Django MoSQL

在不涉及原始SQL危险的情况下,做Django的ORM不能做的事。

为什么?

简短版

因为我想要使用原始SQL,但又懒得考虑安全问题。

详细版

Django的ORM很酷,也很强大。但ORM注定是有漏洞的,不能做你想做的每一件事。这就是为什么Django提供了raw和extra,以便你在需要时可以自定义SQL命令。但是,力量越大,责任越大。当你使用这些方法时,你将失去Django提供的所有SQL安全措施,除非你非常小心,否则可能会成为严重的问题。

这就是MoSQL的由来。简单来说,MoSQL是一个工具,可以从Python函数调用自动生成SQL命令。它还为您处理注入防护。与Django的raw完美匹配!

这个项目所做的一切就是引入一个Django模型管理器子类,并提供一个接口,使用MoSQL的函数调用而不是自己编写SQL字符串。当然,还有一些语法糖。

我该如何使用这个工具?

(本节中的示例受Baron Schwartz的博客文章如何使用SQL选择每组的第一、最小、最大行的启发。)

假设你有一个以下模型

class Fruit(models.Model):
    kind = models.CharField(max_length=10)
    variety = models.CharField(max_length=10)
    price = models.FloatField()

然后您只需要提供 MoManager 作为其模型管理器之一。将 djangomosql 添加到您的 INSTALLED_APPS 中,并按照以下方式修改代码

from djangomosql.models import MoManager

class Fruit(models.Model):
    kind = models.CharField(max_length=10)
    variety = models.CharField(max_length=10)
    price = models.FloatField()

    objects = MoManager()

然后您就可以生成如下查询

from djangomosql.functions import Min

Fruit.objects.select((Min('price'), 'minprice')).group_by('kind').order_by('-kind')

这大致相当于

SELECT fruit.*, MIN(price) as minprice FROM fruit GROUP BY kind ORDER BY kind DESC

当然,如果我们只能做 Django ORM 能做到的事情,这就不会有多大用处。使用 Django MoSQL,您可以实现许多有趣的功能,例如

m = Fruit.objects
inner = m.select((Min('price'), 'minprice')).group_by('kind')
p = m.select().as_('f').order_by('f.kind').join(
    inner, 'x', on={'f.kind': 'x.kind', 'f.price': 'x.minprice'}
)

这可以翻译成(再次,大致上)

SELECT f.* FROM fruit AS f INNER JOIN (
    SELECT *, MIN(price) as minprice FROM fruit GROUP BY kind
) AS x ON f.kind = x.kind AND f.price = x.minprice

最好的是,您还可以免费获得所有转义和 ORM 映射!

许可证

BSD 3-cluse 许可证。请参阅 LICENSE 文件的内容。

开发

要运行测试,请在测试项目内部运行 python manage.py test。您还需要 django-nose 以及依赖项。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

django-mosql-0.5.1.tar.gz (10.3 kB 查看散列)

上传时间

构建分布

django_mosql-0.5.1-py3-none-any.whl (13.6 kB 查看散列)

上传时间 Python 3

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面