diff --git a/sqlquerybuilder/__init__.py b/sqlquerybuilder/__init__.py index 8da4dca..755dd60 100644 --- a/sqlquerybuilder/__init__.py +++ b/sqlquerybuilder/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import datetime import copy -VERSION = "0.0.5" +VERSION = "0.0.6" class classproperty(object): @@ -78,6 +78,7 @@ class F(object): class Q(QMixin): lookup_types = [ 'icontains', 'istartswith', 'iendswith', + 'contains', 'startswith', 'endswith', 'year', 'month', 'day', 'week_day', 'hour', 'minute', 'second', 'isnull', 'in'] @@ -127,13 +128,22 @@ class Q(QMixin): if lookup in self.lookup_types: if lookup == "icontains": - return "{0} like '%{1}%'".format(column, value) + return "{0} LIKE '%{1}%'".format(column, value) if lookup == "iendswith": - return "{0} like '%{1}'".format(column, value) + return "{0} LIKE '%{1}'".format(column, value) - if lookup == "istartwith": - return "{0} like '{1}%'".format(column, value) + if lookup == "istartswith": + return "{0} LIKE '{1}%'".format(column, value) + + if lookup == "contains": + return "{0} LIKE BINARY '%{1}%'".format(column, value) + + if lookup == "endswith": + return "{0} LIKE BINARY '%{1}'".format(column, value) + + if lookup == "startswith": + return "{0} LIKE BINARY '{1}%'".format(column, value) if lookup == "in": return "{0} in ({1})".format(column, self._get_value(value)) diff --git a/sqlquerybuilder/tests.py b/sqlquerybuilder/tests.py index 0ab8156..414cdcd 100644 --- a/sqlquerybuilder/tests.py +++ b/sqlquerybuilder/tests.py @@ -1,6 +1,6 @@ import unittest import datetime -from . import Q, Queryset, F +from sqlquerybuilder import Q, Queryset, F class TestSqlBuilder(unittest.TestCase): @@ -12,6 +12,15 @@ class TestSqlBuilder(unittest.TestCase): self.assertEqual(str(Q(a__isnull=True)), "(a is NULL)") self.assertEqual(str(Q(a__isnull=False)), "(a is NOT NULL)") + self.assertEqual(str(Q(a__startswith="a")), "(a LIKE BINARY 'a%')") + self.assertEqual(str(Q(a__istartswith="a")), "(a LIKE 'a%')") + + self.assertEqual(str(Q(a__endswith="a")), "(a LIKE BINARY '%a')") + self.assertEqual(str(Q(a__iendswith="a")), "(a LIKE '%a')") + + self.assertEqual(str(Q(a__contains="a")), "(a LIKE BINARY '%a%')") + self.assertEqual(str(Q(a__icontains="a")), "(a LIKE '%a%')") + def test_dates(self): date = datetime.date(2010, 1, 15) self.assertEqual(str(Q(fecha=date)), "(fecha='2010-01-15')")