针对mosql的django模型集成。

django-mosql的Python项目详细描述


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

django mosql

做django的orm不能做的事,没有raw的危险。

为什么?

短版本

因为我想使用原始sql,但又懒得担心安全问题。

长版本

django的orm很酷。而且很强大。但是orms注定是漏洞百出的,不能做任何你想做的事情。这就是django提供rawextra的原因,以便您可以在需要时滚动自己的sql命令。但有了强大的力量,就有了巨大的责任。当您使用这些方法时,您将丢失django提供的所有sql安全措施,除非您非常小心,否则这可能是一个严重的问题。

输入MoSQL。简而言之,mosql是一个从python函数调用自动生成sql命令的工具。它会帮你预防注射。与Django的^{TT1}$完美匹配!

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

我怎么用这个东西?

(本节中的示例受施瓦茨男爵this blog post的启发。)

假设您有以下型号:

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以及依赖项。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
NetBeans中的Java Swing滚动窗格   java如何与具有复合键的表建立关系?   Android中读取文件时java数据丢失   java黄瓜场景。embed在ubuntu机器上不工作?   java从spring mvc控制器操作中,我如何获得请求/响应的访问权限?   java减去两个长值   java选择下一个值firebase 安卓   用于起始和结尾连字符的java正则表达式   Java正则表达式解释   java Lifefay freemarker ADT:方法不可用?   java我怎样才能让我的开关盒作用于JFrame?   java在我的场景中使用连接池的理想方式是什么   java我如何接受jsoup的cookies?   java如何将整数数组更改为字符串数组?   java Android操作\u指针\u向上直到剩余触摸移动时才调用   java为什么gradle会出错?   io如何在java中复制/拆分输入流?   java使JButton不可见,但尊重其原始空间   java Spring提交表单获取复选框值不起作用