针对mosql的django模型集成。
django-mosql的Python项目详细描述
django mosql
做django的orm不能做的事,没有raw的危险。
为什么?
短版本
因为我想使用原始sql,但又懒得担心安全问题。
长版本
django的orm很酷。而且很强大。但是orms注定是漏洞百出的,不能做任何你想做的事情。这就是django提供raw和extra的原因,以便您可以在需要时滚动自己的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以及依赖项。